一、簡介
平時我們使用的運算符都是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參數。
