ホームページ  >  記事  >  バックエンド開発  >  C# での演算子のオーバーロード

C# での演算子のオーバーロード

王林
王林オリジナル
2024-09-03 15:13:441087ブラウズ

オーバーロードは、コード実行中にプログラム内の変数やオブジェクトが他のさまざまな形式を取ることを可能にするポリモーフィズム技術を定義および実装するプロセスとして定義できます。この手法は、メソッドのプロパティが引数の型と似ていない場合、実行順序が異なる場合、同じ名前で異なるプロパティを持つメソッドが複数ある場合などに使用できます。これは、異なるメソッドのプログラムで実現できます。パラメータの数の違い、パラメータの種類の違い、パラメータの順序の違い、オプションのパラメータ、名前付き引数など。

C# でのさまざまな演算子のオーバーロード

C# には複数の演算子があります。

  1. すべての二項演算子 (+、-、​​、/、%、&、|、<<、>>) をオーバーロードできます。
  2. すべての単項演算子 (++、-、true、false、+、-、~) をオーバーロードできます。
  3. &&、||、[]、() などの一部の演算子はオーバーロードできません。
  4. 関係演算子をペアでオーバーロードできます。これらは ==、=、<、>、<= 、>= などです。
  5. 複合演算子は二項演算子に関してすでにオーバーロードされているため、それらをオーバーロードできます。

これらは、オーバーロードできる事前定義された演算子です。

構文:

以下は演算子のオーバーロードを実装する構文です。

public static classname  operator op (parameters)
{
// Code
}

単項演算子の場合

public static classname operator op (t)
{
// Code
}

二項演算子の場合

public static classname operator op (t1, t2)
{
// Code
}

演算子は、演算子のオーバーロードを実装するために使用されるキーワードです。演算子のオーバーロードの戻り値の型を void にすることはできません。演算子のオーバーロードでは、事前定義された実装ではなくユーザー定義の実装が常に優先されます。オーバーロードでは、オーバーロードされたメソッドの引数の型、引数の数、引数の順序が異なる必要があります。したがって、演算子をオーバーロードしたメソッドは他のメソッドと同じです。ユーザー定義の実装では、構文と優先順位を変更できません。二項演算子では、.operator の左側はメンバー、右側のオブジェクトはパラメータと呼ばれます。

C# での演算子のオーバーロードの例

以下は、C# で演算子のオーバーロードの概念を実装する方法を示す例です。

例 #1

単項演算子による演算子のオーバーロード。 この例では、単項演算子がオーバーロードに使用されます。 – 演算子は、オーバーロード メソッドを呼び出す Example という名前のクラスで使用されます。  以下のコードで説明したように、コンパイラはそれをoperator-(obj);.

として受け取ります。

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OperatorOverloading
{
class Example
{
public int val1, val2;
public Example(int no1, int no2)
{
val1 = no1;
val2 = no2;
}
public Example()
{
}
public static Example operator -(Example eg1)
{
eg1.val1 = -eg1.val1;
eg1.val1 = -eg1.val1;
return eg1;
}
public void Print()
{
Console.WriteLine("value1 =" + val1);
Console.WriteLine("value2 =" + val2);
Console.Read();
}
class Program
{
static void Main(string[] args)
{
Example eg = new Example(30, -60);
eg.Print();
Example eg1 = new Example();
eg1 = -eg;
eg1.Print();
Console.Read();
}
}
}
}

出力:

C# での演算子のオーバーロード

例 #2

二項演算子による演算子のオーバーロード。 この例では、二項演算子を使用して演算子のオーバーロードを実装する方法を示します。 + 演算子はオブジェクトの追加に使用されます。オペレーターは 1 つのパラメーターを受け取ります。コードでは、num はオブジェクトが渡される Example という名前のクラスのオブジェクトです。オーバーロードでは、演算子の左側はメンバー、右側のオブジェクトはパラメーターと呼ばれます。

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OperatorOverloading
{
class Example
{
public int num;
public Example()
{
num = 0;
}
public Example(int n)
{
num = n;
}
public static Example operator +(Example e1, Example e2)
{
Example e3 = new Example();
e3.num = e1.num + e2.num;
return e3;
}
public void display()
{
Console.WriteLine("{0}", num);
}
}
class Program
{
static void Main(string[] args)
{
Example num = new Example(200);
Example num1 = new Example(300);
Example num2 = new Example();
num2 = num + num1;
num.display();
num1.display();
num2.display();
Console.Read();
}
}
}

出力:

C# での演算子のオーバーロード

例 #3

演算子のオーバーロードと継承。

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OperatorOverloading
{
class Example
{
public int num;
public Example()
{
num = 0;
}
public Example(int n)
{
num = n;
}
public static Example operator +(Example e1, Example e2)
{
Example e3 = new Example();
e3.num = e1.num + e2.num;
return e3;
}
public void display()
{
Console.WriteLine("{0}", num);
}
}
class Example1 : Example
{
private double a;
private double b;
public Example1(double x, double y)
{
a = x;
b = y;
}
public Example1()
{
}
public void Show()
{
Console.WriteLine("{0} {1}", a, b);
}
}
class Program
{
static void Main(string[] args)
{
Example1 num = new Example1(20.0,2.3);
num.Show();
Example1 num1 = new Example1(3.0,3.1);
num1.Show();
Example1 num2 = new Example1();
//num2 = num + num1;
//num2.Show();
Console.Read();
}
}
}

出力:

C# での演算子のオーバーロード

オーバーロードされた演算子は、派生クラスに継承することもできます。派生クラスで宣言された演算子を基底クラスの宣言された演算子を非表示にすることはできないため、

例 #4

等価演算子による演算子のオーバーロード。この例では、等価演算子を使用した演算子のオーバーロードが示されています。等価演算子は比較を行う場合に使用されます。クラス内のメソッドをオーバーロードして比較を行うことができます。このコードでは、オブジェクト e1 と e2 の値は同じです。しかし、彼らの参照は異なります。オブジェクトの値の比較は参照ベースで行われます。 e2 と e3 の場合、同じオブジェクトを参照します。

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OperatorOverloading
{
class Example
{
private int a;
private int b;
public Example()
{
}
public Example(int x, int y)
{
a = x;
b = y;
}
public void Display()
{
Console.WriteLine("{0} {1}", a, b);
}
}
class Program
{
public static void Main()
{
Example e1 = new Example(30, 20);
e1.Display();
Example e2 = new Example(30, 20);
e2.Display();
Example e3 = e2;
e3.Display();
if (e1.Equals(e2))
Console.WriteLine("equal");
else
Console.WriteLine("not equal");
if (e2.Equals(e3))
Console.WriteLine("equal");
Console.ReadLine();
}
}
}

出力:

C# での演算子のオーバーロード

結論

演算子のオーバーロードは重要な概念です。これにより、複数の操作で演算子を再利用できるようになります。 C# では、定義されたパラメーターのセットのみをオーバーロードできます。 .Net のすべての言語が演算子のオーバーロードをサポートしているわけではありません。したがって、C# では、ユーザー定義の実装に関して追加機能が提供されます。

以上がC# での演算子のオーバーロードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。