C# 运算符重载
C# の組み込み演算子は再定義またはオーバーロードできます。したがって、プログラマーはユーザー定義型に対しても演算子を使用できます。オーバーロードされた演算子は、特別な名前を持つ関数であり、キーワードoperatorの後に演算子の記号を続けて定義されます。他の関数と同様に、オーバーロードされた演算子には戻り値の型とパラメーターリストがあります。
例えば、次の関数を見てください:
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
上記の関数は、ユーザー定義のクラス Box に加算演算子(+)を実装します。これは2つの Box オブジェクトのプロパティを加算し、加算後の Box オブジェクトを返します。
演算子オーバーロードの実装
以下のプログラムは完全な実装を示しています:
实例
using System;
namespace OperatorOvlApplication
{
class Box
{
private double length; // 长度
private double breadth; // 宽度
private double height; // 高度
public double getVolume()
{
return length * breadth * height;
}
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
// + 演算子をオーバーロードして、2 つの Box オブジェクトを加算する
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
}
class Tester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Box1 を宣言、型は Box
Box Box2 = new Box(); // Box2 を宣言、型は Box
Box Box3 = new Box(); // Box3 を宣言、型は Box
double volume = 0.0; // 体积
// Box1 详述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Box2 详述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// Box1 の体積
volume = Box1.getVolume();
Console.WriteLine("Box1 の体積: {0}", volume);
// Box2 の体積
volume = Box2.getVolume();
Console.WriteLine("Box2 の体積: {0}", volume);
// 2つのオブジェクトを加算する
Box3 = Box1 + Box2;
// Box3 の体積
volume = Box3.getVolume();
Console.WriteLine(Box3 の体積: {0}, volume);
Console.ReadKey();
}
}
}
namespace OperatorOvlApplication
{
class Box
{
private double length; // 长度
private double breadth; // 宽度
private double height; // 高度
public double getVolume()
{
return length * breadth * height;
}
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
// + 演算子をオーバーロードして、2 つの Box オブジェクトを加算する
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
}
class Tester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Box1 を宣言、型は Box
Box Box2 = new Box(); // Box2 を宣言、型は Box
Box Box3 = new Box(); // Box3 を宣言、型は Box
double volume = 0.0; // 体积
// Box1 详述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Box2 详述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// Box1 の体積
volume = Box1.getVolume();
Console.WriteLine("Box1 の体積: {0}", volume);
// Box2 の体積
volume = Box2.getVolume();
Console.WriteLine("Box2 の体積: {0}", volume);
// 2つのオブジェクトを加算する
Box3 = Box1 + Box2;
// Box3 の体積
volume = Box3.getVolume();
Console.WriteLine(Box3 の体積: {0}, volume);
Console.ReadKey();
}
}
}
上記のコードがコンパイルされ実行されると、次の結果が生成されます:
Box1 的体积: 210 Box2 的体积: 1560 Box3 的体积: 5400
オーバーロード可能および不可能な演算子
次の表は、C# における演算子オーバーロードの機能を示しています。
| 运算符 | 描述 |
|---|---|
| +, -, !, ~, ++, -- | これらの単項演算子はオペランドを1つだけ持ち、オーバーロード可能です。 |
| +, -, *, /, % | これらの二項演算子は2つのオペランドを持ち、オーバーロード可能です。 |
| ==, !=, <, >, <=, >= | これらの比較演算子はオーバーロードできます。 |
| &&, || | これらの条件付き論理演算子は直接オーバーロードできません。 |
| +=, -=, *=, /=, %= | これらの代入演算子はオーバーロードできません。 |
| =, ., ?:, ->, new, is, sizeof, typeof | これらの演算子はオーバーロードできません。 |
实例
上記の議論に基づいて、上記の例を拡張して、さらに多くの演算子をオーバーロードしてみましょう:
实例
using System;
namespace OperatorOvlApplication
{
class Box
{
private double length; // 长度
private double breadth; // 宽度
private double height; // 高度
public double getVolume()
{
return length * breadth * height;
}
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
// + 演算子をオーバーロードして、2 つの Box オブジェクトを加算する
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
public static bool operator == (Box lhs, Box rhs)
{
bool status = false;
if (lhs.length == rhs.length && lhs.height == rhs.height
&& lhs.breadth == rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator !=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length != rhs.length || lhs.height != rhs.height
|| lhs.breadth != rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator <(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length < rhs.length && lhs.height
< rhs.height && lhs.breadth < rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator >(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length > rhs.length && lhs.height
> rhs.height && lhs.breadth > rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator <=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length <= rhs.length && lhs.height
<= rhs.height && lhs.breadth <= rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator >=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length >= rhs.length && lhs.height
>= rhs.height && lhs.breadth >= rhs.breadth)
{
status = true;
}
return status;
}
public override string ToString()
{
return String.Format("({0}, {1}, {2})", length, breadth, height);
}
}
class Tester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Box1 を宣言、型は Box
Box Box2 = new Box(); // Box2 を宣言、型は Box
Box Box3 = new Box(); // Box3 を宣言、型は Box
Box Box4 = new Box();
double volume = 0.0; // 体积
// Box1 详述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Box2 详述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// オーバーロードされた ToString() を使用して2つのボックスを表示する
Console.WriteLine("Box1: {0}", Box1.ToString());
Console.WriteLine("Box2: {0}", Box2.ToString());
// Box1 の体積
volume = Box1.getVolume();
Console.WriteLine("Box1 の体積: {0}", volume);
// Box2 の体積
volume = Box2.getVolume();
Console.WriteLine("Box2 の体積: {0}", volume);
// 2つのオブジェクトを加算する
Box3 = Box1 + Box2;
Console.WriteLine("Box3: {0}", Box3.ToString());
// Box3 の体積
volume = Box3.getVolume();
Console.WriteLine(Box3 の体積: {0}, volume);
//comparing the boxes
if (Box1 > Box2)
Console.WriteLine("Box1 大于 Box2");
else
Console.WriteLine("Box1 不大于 Box2");
if (Box1 < Box2)
Console.WriteLine("Box1 小于 Box2");
else
Console.WriteLine("Box1 不小于 Box2");
if (Box1 >= Box2)
Console.WriteLine("Box1 大于等于 Box2");
else
Console.WriteLine("Box1 不大于等于 Box2");
if (Box1 <= Box2)
Console.WriteLine("Box1 小于等于 Box2");
else
Console.WriteLine("Box1 不小于等于 Box2");
if (Box1 != Box2)
Console.WriteLine("Box1 不等于 Box2");
else
Console.WriteLine("Box1 等于 Box2");
Box4 = Box3;
if (Box3 == Box4)
Console.WriteLine("Box3 等于 Box4");
else
Console.WriteLine("Box3 不等于 Box4");
Console.ReadKey();
}
}
}
namespace OperatorOvlApplication
{
class Box
{
private double length; // 长度
private double breadth; // 宽度
private double height; // 高度
public double getVolume()
{
return length * breadth * height;
}
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
// + 演算子をオーバーロードして、2 つの Box オブジェクトを加算する
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
public static bool operator == (Box lhs, Box rhs)
{
bool status = false;
if (lhs.length == rhs.length && lhs.height == rhs.height
&& lhs.breadth == rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator !=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length != rhs.length || lhs.height != rhs.height
|| lhs.breadth != rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator <(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length < rhs.length && lhs.height
< rhs.height && lhs.breadth < rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator >(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length > rhs.length && lhs.height
> rhs.height && lhs.breadth > rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator <=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length <= rhs.length && lhs.height
<= rhs.height && lhs.breadth <= rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator >=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length >= rhs.length && lhs.height
>= rhs.height && lhs.breadth >= rhs.breadth)
{
status = true;
}
return status;
}
public override string ToString()
{
return String.Format("({0}, {1}, {2})", length, breadth, height);
}
}
class Tester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Box1 を宣言、型は Box
Box Box2 = new Box(); // Box2 を宣言、型は Box
Box Box3 = new Box(); // Box3 を宣言、型は Box
Box Box4 = new Box();
double volume = 0.0; // 体积
// Box1 详述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Box2 详述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// オーバーロードされた ToString() を使用して2つのボックスを表示する
Console.WriteLine("Box1: {0}", Box1.ToString());
Console.WriteLine("Box2: {0}", Box2.ToString());
// Box1 の体積
volume = Box1.getVolume();
Console.WriteLine("Box1 の体積: {0}", volume);
// Box2 の体積
volume = Box2.getVolume();
Console.WriteLine("Box2 の体積: {0}", volume);
// 2つのオブジェクトを加算する
Box3 = Box1 + Box2;
Console.WriteLine("Box3: {0}", Box3.ToString());
// Box3 の体積
volume = Box3.getVolume();
Console.WriteLine(Box3 の体積: {0}, volume);
//comparing the boxes
if (Box1 > Box2)
Console.WriteLine("Box1 大于 Box2");
else
Console.WriteLine("Box1 不大于 Box2");
if (Box1 < Box2)
Console.WriteLine("Box1 小于 Box2");
else
Console.WriteLine("Box1 不小于 Box2");
if (Box1 >= Box2)
Console.WriteLine("Box1 大于等于 Box2");
else
Console.WriteLine("Box1 不大于等于 Box2");
if (Box1 <= Box2)
Console.WriteLine("Box1 小于等于 Box2");
else
Console.WriteLine("Box1 不小于等于 Box2");
if (Box1 != Box2)
Console.WriteLine("Box1 不等于 Box2");
else
Console.WriteLine("Box1 等于 Box2");
Box4 = Box3;
if (Box3 == Box4)
Console.WriteLine("Box3 等于 Box4");
else
Console.WriteLine("Box3 不等于 Box4");
Console.ReadKey();
}
}
}
上記のコードがコンパイルされ実行されると、次の結果が生成されます:
Box1: (6, 7, 5) Box2: (12, 13, 10) Box1 的体积: 210 Box2 的体积: 1560 Box3: (18, 20, 15) Box3 的体积: 5400 Box1 不大于 Box2 Box1 小于 Box2 Box1 不大于等于 Box2 Box1 小于等于 Box2 Box1 不等于 Box2 Box3 等于 Box4其他扩展