Files
2026-06-21 09:51:55 +08:00

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 也成立,需要再额外写一份对应重载
  • 运算符重载最重要的是==语义自然==,不要让 + 去做奇怪的事

常见可重载运算符:

  • 一元:+ - ! ~ ++ -- true false
  • 二元:+ - * / % & | ^ << >>
  • 比较:== != < > <= >=

不能直接重载的常见运算符:

  • && ||
  • []
  • ()
  • .
  • =
  • ?:
  • ??

注意:

  1. ==传统写法里,运算符重载通常写成 public static==
  2. 参数里至少要有一个参数是当前类型
  3. 不能给运算符参数加 refout
  4. 某些运算符需要成对实现:
    • ==!=
    • <>
    • <=>=
    • truefalse
  5. 如果重载了 == / !=,通常也应该一起重写 EqualsGetHashCode
  6. && / || 不能直接重载,但可以结合 true / false& / | 实现相关行为

#核心