平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“C# 运算符重载的实现方法示例”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
运算符重载属于 静态多态,指重新定义原有运算符的运算逻辑。
核心作用:让 自定义类的对象 兼容 +、-、++、>、< 等运算(默认对象不能直接运算)。
public static 返回值类型 operator 运算符(参数列表)
{
// 自定义运算逻辑
}
强制要求:必须是 public static,缺一不可。
业务场景:定义盒子类,包含长宽高,借助重载实现对象之间运算、体积比较。
逻辑:两个盒子长宽高分别对应相加,得到新盒子对象
public static Box operator +(Box b1, Box b2)
{
return new Box()
{
Length = b1.Length + b2.Length,
Width = b1.Width + b2.Width,
Height = b1.Height + b2.Height
};
}
调用:Box b3 = b1 + b2;
逻辑:不做属性相减,计算两个盒子体积差值,得到 int 类型
public static int operator -(Box b1, Box b2)
{
return b1.Length * b1.Width * b1.Height - b2.Length * b2.Width * b2.Height;
}
调用:int b4 = b1 - b2;
关键点:运算符重载得到值类型能够自定义,不强制和参数类型一致。
逻辑:盒子长宽高各自 +1,得到新对象
public static Box operator ++(Box b1)
{
return new Box()
{
Length = b1.Length + 1,
Width = b1.Width + 1,
Height = b1.Height + 1,
};
}
Box b5 = b1++;
Console.WriteLine(b1.Length);//11 原对象已更新
Console.WriteLine(b5.Length);//10 返回的是旧值对象
自增重载遵循 后置自增规则:先赋值、后自增。
业务逻辑:根据 盒子体积 Volume 比较大小
//重载大于
public static bool operator >(Box b1, Box b2)
{
return b1.Volume > b2.Volume;
}
//重载小于
public static bool operator <(Box b1, Box b2)
{
return b1.Volume < b2.Volume;
}
调用结果:
b1 > b2 → false(b1体积更小)b1 < b2 → trueoperator 关键字可重载与不可重载的运算符
| 运算符 | 可重载性 |
|---|---|
| +、-、!、++、-- | 这些一元运算符能够进行重载 |
| <、>、=、!=、<=、>= | 这些二元运算符能够进行重载,这里需留意某些运算符必须成对重载 |
| &&、|| | 无法重载逻辑运算符 |
| (type)var_name | 强制类型转换运算符不能重载 |
| +=、-=、*=、/=、%=、&=、|=、^=、<<=、>>= | 在这个场景下,复合赋值运算符不能显式重载。 但在重载二元运算符时,也会隐式重载相应的复合赋值运算符,比如重载了+运算符也会隐式的重载+= |
| ^、=、.、?.、? :、??、??=、..、->、=>、as、await、checked、unchecked、default、delegate、is、nameof、new、sizeof、stackalloc、switch、typeof | 这些运算符无法进行重载 |
注意:比较运算符必须成对重载,也就是说,如果重载一对运算符中的任意一个,则另一个运算符也必须重载。比如==和!=运算符、<和>运算符、<=和>=运算符
Box b1 = new Box(10, 20, 30);
Box b2 = new Box(30, 40, 50);
b1 + b2 // 属性分别相加,返回新盒子
b1 - b2 // 计算体积差值,返回int
b1++ // 长宽高+1,后置自增
b1 > b2 // 体积对比 返回false
b1 < b2 // 体积对比 返回true
结合项目来看,总的来说,C# 运算符重载适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。