1.8 KiB
1.8 KiB
运算符重载
概念:
- 运算符重载可以让==自定义类型==像内置类型一样使用某些运算符
- 本质上是给运算符提供一套你自己定义的行为
通常用法:
- 坐标、向量、复数、金额等“天然适合运算”的类型
语法:
public static 返回值类型 operator 运算符(参数列表)
{
// 自定义逻辑
}
案例:
class Point
{
public int X;
public int Y;
public static Point operator +(Point p1, Point p2)
{
return new Point
{
X = p1.X + p2.X,
Y = p1.Y + p2.Y
};
}
public static Point operator +(Point p, int value)
{
return new Point
{
X = p.X + value,
Y = p.Y + value
};
}
}
Point p1 = new Point { X = 1, Y = 1 };
Point p2 = new Point { X = 2, Y = 2 };
Point p3 = p1 + p2;
Point p4 = p1 + 10;
Console.WriteLine($"{p3.X}, {p3.Y}");
Console.WriteLine($"{p4.X}, {p4.Y}");
补充:
- 如果你希望
10 + p1也成立,需要再额外写一份对应重载 - 运算符重载最重要的是==语义自然==,不要让
+去做奇怪的事
常见可重载运算符:
- 一元:
+-!~++--truefalse - 二元:
+-*/%&|^<<>> - 比较:
==!=<><=>=
不能直接重载的常见运算符:
&&||[]().=?:??
注意:
- ==传统写法里,运算符重载通常写成
public static== - 参数里至少要有一个参数是当前类型
- 不能给运算符参数加
ref或out - 某些运算符需要成对实现:
==和!=<和><=和>=true和false
- 如果重载了
==/!=,通常也应该一起重写Equals和GetHashCode &&/||不能直接重载,但可以结合true/false和&/|实现相关行为
#核心