一、简介
平时我们使用的运算符都是C#内置定义好的,比如+-*/等等,但是我们项目中遇到复杂一点的运算方式,只能我们自己重载相应的运算符。比如两个类相加+,我们可以重载类的+运算符,在函数里面,自定义我们的规则。
operator 关键字定义静态成员函数,来允许用户定义的类型重载运算符。
二、详细说明
不过并非所有运算符都可以进行重载,并且其他运算符具有限制
运算符
|
可重载性
|
+、-、!、~、++、--、true、false
|
这些一元运算符可以进行重载。
|
+, -, *, /, %, &, |, ^, <<, >>
|
这些二元运算符可以进行重载。
|
==, !=, <, >, <=, >=
|
比较运算符可以进行重载(但是请参阅此表后面的备注)。
|
&&, ||
|
条件逻辑运算符无法进行重载,但是它们使用 & 和 |(可以进行重载)来计算。
|
[]
|
数组索引运算符无法进行重载,但是可以定义索引器。
|
(T)x
|
强制转换运算符无法进行重载,但是可以定义新转换运算符(请参阅 explicit 和 implicit)。
|
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
|
赋值运算符无法进行重载,但是 +=(举例)使用 +(可以进行重载)来计算。
|
=、.、?:、??、->、=>、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参数。
|
请发表评论