C# 運算符重載


一、簡介

  平時我們使用的運算符都是C#內置定義好的,比如+-*/等等,但是我們項目中遇到復雜一點的運算方式,只能我們自己重載相應的運算符。比如兩個類相加+,我們可以重載類的+運算符,在函數里面,自定義我們的規則。

  C# 通過使用 operator 關鍵字定義靜態成員函數,來允許用戶定義的類型重載運算符。 

 


 二、詳細說明

    不過並非所有運算符都可以進行重載,並且其他運算符具有限制

運算符

可重載性

+-!~++--truefalse

這些一元運算符可以進行重載。

+-*/%&|^<<>>

這些二元運算符可以進行重載。

==!=<><=>=

比較運算符可以進行重載(但是請參閱此表后面的備注)。

&&||

條件邏輯運算符無法進行重載,但是它們使用 & 和 |(可以進行重載)來計算。

[]

數組索引運算符無法進行重載,但是可以定義索引器。

(T)x

強制轉換運算符無法進行重載,但是可以定義新轉換運算符(請參閱 explicit 和 implicit)。

+=-=*=/=%=&=|=^=<<=>>=

賦值運算符無法進行重載,但是 +=(舉例)使用 +(可以進行重載)來計算。

=.?:??->=>f(x)ascheckeduncheckeddefaultdelegateisnewsizeoftypeof

這些運算符無法進行重載。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 備注:

  如果進行重載,則比較運算符必須成對進行重載;也就是說,如果 == 進行重載,則 != 也必須進行重載。 反過來也成立,其中重載 != 需要重載 ==。 對於比較運算符 < 和 >,以及 <= 和 >=,也成立。

 


三、示例

  定義一個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#要求所有的運算符重載都聲明為publicstatic,必須是類的靜態方法,這表示它們與它們的類或結構相關聯,而不是與實例相關聯
  • C# 不允許重載=運算符,但如果重載例如+運算符,編譯器會自動使用+運算符的重載來執行+=運算符的操作。
  • 運算符只能采用值參數,不能采用ref或out參數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM