C#中可重载的运算符包括一元、二元及部分特殊运算符,但赋值、逻辑与或、三元等不可重载;常见于自定义数值、几何、时间等类型,提升代码直观性;重载需遵循public static、至少一个参数为当前类型、成对重载==与!=等规则,并保持行为直观、一致,且同步重写Equals与GetHashCode以避免集合操作异常。

C#中,
operator
int
string
要重载一个运算符,你需要在你的类或结构体内部,定义一个特殊的
public static
operator
举个例子,假设我们有一个表示二维向量的
Vector2D
Vector2D
public struct Vector2D
{
public double X { get; }
public double Y { get; }
public Vector2D(double x, double y)
{
X = x;
Y = y;
}
// 重载加法运算符 (+)
public static Vector2D operator +(Vector2D v1, Vector2D v2)
{
// 向量相加就是对应分量相加
return new Vector2D(v1.X + v2.X, v1.Y + v2.Y);
}
// 重载乘法运算符 (*) - 向量乘以标量
public static Vector2D operator *(Vector2D v, double scalar)
{
return new Vector2D(v.X * scalar, v.Y * scalar);
}
// 重载乘法运算符 (*) - 标量乘以向量 (为了对称性)
public static Vector2D operator *(double scalar, Vector2D v)
{
return new Vector2D(v.X * scalar, v.Y * scalar);
}
// 重载相等运算符 (==)
public static bool operator ==(Vector2D v1, Vector2D v2)
{
// 考虑浮点数比较的精度问题,这里简化处理
return v1.X == v2.X && v1.Y == v2.Y;
}
// 重载不相等运算符 (!=)
public static bool operator !=(Vector2D v1, Vector2D v2)
{
return !(v1 == v2); // 直接利用 == 的结果
}
// 重载 == 和 != 后,强烈建议重写 Equals 和 GetHashCode
public override bool Equals(object obj)
{
if (!(obj is Vector2D))
{
return false;
}
return this == (Vector2D)obj;
}
public override int GetHashCode()
{
// 简单的哈希码组合,实际应用中可能需要更复杂的算法
return X.GetHashCode() ^ Y.GetHashCode();
}
public override string ToString()
{
return $"({X}, {Y})";
}
}
// 实际使用
// Vector2D vecA = new Vector2D(1, 2);
// Vector2D vecB = new Vector2D(3, 4);
// Vector2D vecC = vecA + vecB; // 向量相加,结果是 (4, 6)
// Vector2D vecD = vecA * 2.0; // 向量乘以标量,结果是 (2, 4)
// bool areEqual = vecA == new Vector2D(1, 2); // true可以看到,通过重载,
Vector2D
C#允许重载的运算符种类还挺多的,但也不是所有符号都能动。大致可以分为几类:
一元运算符 (Unary Operators):
+
+a
-
-a
!
~
++
--
true
false
if
二元运算符 (Binary Operators):
+
-
*
/
%
&
|
^
<<
>>
==
!=
<
>
<=
>=
常见的应用场景呢? 我觉得主要集中在以下几个方面:
ComplexNumber
+
-
*
/
ComplexNumber.Add(c1, c2)
Vector2D
Point
Matrix
Duration
+
DateTime
Duration
Money
Money A + Money B
在我看来,重载运算符的根本目的就是为了提高代码的“表达力”和“自然度”。当你的代码读起来就像在描述数学公式或现实世界的逻辑时,它的可读性就大大增强了。
虽然
operator
public static
public
=
+=
-=
*=
/=
+=
&&
||
?:
.
new
typeof
sizeof
is
as
[]
operator
int
int
public static int operator +(int a, int b)
==
!=
<
>
<=
>=
==
!=
bool
true
false
bool
int
double
string
这些限制,在我看来,更多的是一种保护机制,防止开发者滥用运算符重载,导致代码变得难以理解和维护。
仅仅知道怎么重载和有哪些限制还不够,更重要的是在什么时候、以什么方式去重载。这里有一些我个人觉得非常重要的设计原则和最佳实践:
+
*
+
*
Vector2D
+
-
struct
Vector2D v3 = v1 + v2;
v1
v2
v3
Equals
GetHashCode
==
!=
Equals(object obj)
GetHashCode()
Dictionary<TKey, TValue>
HashSet<T>
Equals
GetHashCode
==
implicit
explicit
string
int
总的来说,运算符重载是一把双刃剑。用得好,代码如诗;用得不好,代码如谜。关键在于理解其背后的机制和限制,并始终以提升代码清晰度和可维护性为目标。
以上就是C#的operator关键字如何重载运算符?有哪些限制?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号