在C#中,运算符重载(Operator Overloading)允许你为类或结构体自定义运算符的行为。这意味着你可以定义当使用特定运算符(如+、-、*、/等)操作你的类或结构体的实例时应该发生什么。
运算符重载的规则
不能改变运算符的优先级和结合性: 你只能改变运算符作用于你的类型时的行为,不能改变它的基本运算规则。
不能重载不可重载的运算符:例如,.、…、::、?:、=、ref、out`等运算符不能重载。
必须声明为public或static成员: 运算符重载方法必须是类的公共静态成员。
不能改变运算符的操作数个数: 例如,你不能使一元运算符(如+)接受两个操作数,也不能使二元运算符(如+)只接受一个操作数。
通常应重载逻辑上相关的运算符: 例如,如果你重载了+运算符,那么通常也应该重载-、*等,以保持一致性。
如何重载运算符
重载运算符是通过在类或结构体内部定义一个特殊的方法来实现的,该方法的名字是operator关键字后面跟着要重载的运算符符号。例如,要重载加法运算符+,你可以这样定义:
public class Complex
{
public double Real { get; }
public double Imaginary { get; }
public Complex(double real, double imaginary)
{
Real = real;
Imaginary = imaginary;
}
// 重载加法运算符
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary);
}
// 通常还需要重载其他运算符和/或重写一些方法,如ToString(),以便更好地使用该类
public override string ToString()
{
return $"{Real} + {Imaginary}i";
}
}
在这个例子中,Complex类表示一个复数,它有两个属性:Real和Imaginary。我们重载了加法运算符+,以便当两个Complex对象相加时,它们的实部和虚部分别相加。
使用重载的运算符
一旦你重载了运算符,你就可以像使用内置运算符一样使用它:
Complex c1 = new Complex(1, 2);
Complex c2 = new Complex(3, 4);
Complex c3 = c1 + c2; // 使用重载的+运算符
//Console.WriteLine(c3);// 输出 "4 + 6i"
Console.WriteLine(c3.ToString()); // 输出 "4 + 6i"
可重载和不可重载运算符
下表描述了 C# 中运算符重载的能力:
注意事项
- 运算符重载应该提供直观和有用的功能,而不是引起混淆或误导。
- 不要为了重载而重载;如果运算符的重载不会提供额外的价值或清晰度,那么最好不要重载它。
- 在重载运算符时,要考虑到异常处理和边界条件,以确保你的代码健壮且易于维护。