运算符重载允许C#中自定义类型支持+、-、==等操作,需在类或结构中定义public Static方法,使用operator关键字,如Complex类重载+和==实现复数相加与比较。

运算符重载是C#中一种允许为自定义类型(如类或结构)重新定义运算符行为的机制。默认情况下,C#只支持对内置类型(如int、double等)进行加减乘除等操作,而无法直接对自定义对象使用这些运算符。通过运算符重载,你可以让自定义类型也支持+、-、==、!=、等常见操作,使代码更直观、自然。
运算符重载的基本规则
要在C#中重载运算符,需在类或结构中定义一个静态方法,使用operator关键字声明。重载的运算符必须是public和static,并且至少有一个参数的类型是当前类或结构。
常见的可重载运算符包括:
- 一元运算符:+、-、!、++、–、true、false
- 二元运算符:+、-、*、/、%、==、!=、、=
- 转换运算符:用于定义类型之间的隐式或显式转换
示例:为复数类重载加法和相等运算符
假设我们有一个表示复数的结构Complex,希望支持两个复数相加以及比较是否相等:
public struct Complex { public double Real { get; } public double Imaginary { get; } public Complex(double real, double imaginary) { Real = real; Imaginary = imaginary; } // 重载 + 运算符 public static Complex operator +(Complex a, Complex b) { return new Complex(a.Real + b.Real, a.Imaginary + b.Imaginary); } // 重载 == 运算符 public static bool operator ==(Complex a, Complex b) { return a.Real == b.Real && a.Imaginary == b.Imaginary; } // 重载 != 运算符 public static bool operator !=(Complex a, Complex b) { return !(a == b); } // 重写 Equals 方法以保持一致性 public override bool Equals(object obj) { if (obj is Complex c) return this == c; return false; } // 重写 GetHashCode public override int GetHashCode() { return HashCode.Combine(Real, Imaginary); } }
使用方式非常自然:
“`csharp var c1 = new Complex(2, 3); var c2 = new Complex(1, 4); var sum = c1 + c2; // 使用重载的 + bool isEqual = c1 == c2; // 使用重载的 == “`
注意事项与最佳实践
虽然运算符重载提升了代码可读性,但也需要注意以下几点:
- 不要改变运算符的常规语义。例如,+ 应该表示“组合”或“相加”,而不是减法或其他奇怪操作
- 成对重载相关运算符。比如重载了 ==,就必须重载 !=;重载了 等
- 如果重载 == 和 !=,建议同时重写
Equals()和GetHashCode(),确保对象在集合中的行为一致 - 转换运算符可以用
implicit(隐式)或explicit(显式)定义,但要避免歧义或意外转换
基本上就这些。合理使用运算符重载能让自定义类型像内置类型一样自然地参与表达式运算,提升代码的表达力和可维护性。