一、简介
平时我们使用的运算符都是C#内置定义好的,比如+-*/等等,但是我们项目中遇到复杂一点的运算方式,只能我们自己重载相应的运算符。比如两个类相加+,我们可以重载类的+运算符,在函数里面,自定义我们的规则。
C# 通过使用 operator 关键字定义静态成员函数,来允许用户定义的类型重载运算符。
二、详细说明
不过并非所有运算符都可以进行重载,并且其他运算符具有限制
运算符 |
可重载性 |
这些一元运算符可以进行重载。 |
|
这些二元运算符可以进行重载。 |
|
比较运算符可以进行重载(但是请参阅此表后面的备注)。 |
|
条件逻辑运算符无法进行重载,但是它们使用 & 和 |(可以进行重载)来计算。 |
|
数组索引运算符无法进行重载,但是可以定义索引器。 |
|
赋值运算符无法进行重载,但是 +=(举例)使用 +(可以进行重载)来计算。 |
|
=、.、?:、??、->、=>、f(x)、as、checked、unchecked、default、delegate、is、new、sizeof、typeof |
这些运算符无法进行重载。 |
备注:
如果进行重载,则比较运算符必须成对进行重载;也就是说,如果 ==
进行重载,则 !=
也必须进行重载。 反过来也成立,其中重载 !=
需要重载 ==
。 对于比较运算符 <
和 >
,以及 <=
和 >=
,也成立。
三、示例
定义一个rect类,存储宽高。主要讲解 +的重载
class Rect
{
public Rect(int w, int h)
{
W = w;
H = h;
}
int W;
int H;
//重载 类的+运算符
public static Rect operator +(Rect x, Rect y)
{
return new Rect(x.W + y.W, x.H + y.H); //自定义代码
}
}
调用
调用特别简单,就像使用默认+运算符一样
Rect x = new Rect(3,5);
Rect y = new Rect(2, 2);
Rect my = x + y; //调用自定义的 + 运算符
四、总结
- 尽可能的不要改变运算符本身的含义
- 不同于扩展方法,所重载的方法必须是在被重载的类型内部,且用关键字operator
- 二元重载符,其中一个参数必须是封闭类型(就是自定义类型)
- C#要求所有的运算符重载都声明为public和static,必须是类的静态方法,这表示它们与它们的类或结构相关联,而不是与实例相关联。
- C# 不允许重载=运算符,但如果重载例如+运算符,编译器会自动使用+运算符的重载来执行+=运算符的操作。
- 运算符只能采用值参数,不能采用ref或out参数。