成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#運算符重載的一些總結

開發 后端
C#運算符重載的概念,種類,C#運算符重載應用,本文向你系統的講解了C#運算符重載的一系列問題。希望對你學習C#運算符重載有所幫助。

C#運算符重載的概念是什么呢?

重載是面向對象中的一個重要概念,它是對象多態性的一種不完全體現,人們通常所說的重載,往往指的是函數的重載。本文向讀者介紹一種新的重載模型——運算符重載。

為什么需要C#運算符重載

函數的重載為一個對象上的相同行為提供不同的參數方式,這樣,開發人員便可以使用這些不同的參數實現類似的功能。一組函數重載決策一般實現的功能是相同的,例如對 Object 對象上的 ToString() 方法就有幾個重載版本,雖然它們接受的參數不同,但卻都表達同一個行為的最終結果。參數的不同導致函數重載版本的簽名不同,這樣編譯器很容易知道需要調用那一個重載版本。這種技術給開發人員帶來了方便。

現在我們試圖對重載的定義進行推廣。先讓我們看看最簡單的例子,我們通常需要像這樣聲明并初始化一個值類型的變量:

  1. int digit = 5;  
  2. string sayHello = "Hello, World"

這里的“=”運算符,就是將右邊的值傳遞給左邊變量的賦值運算符。這里,5 的類型為 int,“Hello, World”的類型為 string,這與左邊被賦值的變量類型完全一致。

但對于上述的解釋,我們還可以這樣認為:5 的類型為 uint 或 byte,"Hello, World"的類型為 char[],那么如此一來,賦值運算左邊和右邊的類型就不在等同,那么編譯器如何處理呢?有人會說,這就是“隱式類型轉換”,這個答案確實很好,但隱式類型轉換的規則已經被編譯器確定,如果賦值運算的兩端不遵循隱式類型轉換規則,則需要顯式類型轉換,例如:

  1. char c = '2';  
  2. string s = (string)c;  
  3. int i = (int)c; 

這些顯式類型轉換并不適用于任何場合,也許人們希望在其自定義的類中也能用賦值、加減乘除等語法操作它們。

對象和對象之間是可能存在這種特殊的運算關系的,一個典型的例子就是“復數”對象。復數是一個值類型對象,它包含兩個 double 類型的域,兩個復數對象可以被加、減、乘、除和相等性判斷,但無法比較大小。我們試想可以如此操作復數類:

  1. Complex c1, c2;  
  2. c1 = new Complex(3, 4);  
  3. c2 = "4+5i";  
  4. var c3 = c1 * c2 / -c1 + c2;  
  5. if (c1 == c2) c3 = c1; else c3 = c2; 

我們可以從這些代碼可以預見C#運算符重載所需要實現的功能:

1、支持隱式類型轉換和顯式類型轉換的重載決策。

2、支持基本二元運算符,如加、減、乘、除等。

3、支持基本一元運算符,如取負、取反、自增、自減等。

4、支持基本關系運算符,如大于、小于、等于和不等于等。

5、實現更加復雜的運算符,如三元運算、[]、()、位運算等。

事實上,運算符重載的提出就是為了解決這些問題。在 CLR 框架下的各種 CLR 語言,均不同程度的支持運算符重載。Visual Basic 在 8.0 版本上(也就是 Visual Studio 2005)也支持了運算符重載,運算符重載除了以上列出的優點外,還具備如下特點。

1、使得代碼更加容易理解和閱讀。

2、可以利用現有運算符的優先級關系規則處理對象之間的運算。

3、使得代碼更加靈活,對象可操作性更好。

4、開發人員可以舉一反三,因為他們熟悉了常規值類型上的運算符使用,這樣可以直接將這些規則引入到自定義對象上。

下面我們通過介紹復數類的定義,來深入 C# 語言中的運算符重載。

C# 運算符重載決策示例

下面的例子定義一個 Complex 類,實現了復數加、減、乘和除的四則運算。C# 中定義常規運算符的語法如下:

  1. [public | private | protected | internal | internal protected]   
  2.  
  3. static <return type> | implicit | explicit operator  (  ) 

下面是C#運算符重載(C# 3.0) 代碼。

  1.     struct Complex  
  2.     ...{  
  3.         public double Real ...{ getset; }  
  4.         public double Imaginary ...{ getset; }  
  5.  
  6.         public Complex(double real, double imaginary) : this() ...{ 
  7. this.Real = real; this.Imaginary = imaginary; }  
  8.  
  9.         public static Complex operator +(Complex c1, Complex c2)  
  10.         ...{  
  11.             return new Complex ...{ Real = c1.Real + c2.Real, 
  12. Imaginary = c1.Imaginary + c2.Imaginary };  
  13.         }  
  14.  
  15.         public static Complex operator -(Complex c1, Complex c2)  
  16.         ...{  
  17.             return new Complex ...{ Real = c1.Real - c2.Real, 
  18. Imaginary = c1.Imaginary - c2.Imaginary };  
  19.         }  
  20.  
  21.         public static Complex operator *(Complex c1, Complex c2)  
  22.         ...{  
  23.             return new Complex ...{ Real = c1.Real * c2.Real - c1.Imaginary * c2.Imaginary, 
  24. Imaginary = c1.Real * c2.Imaginary   - c1.Imaginary * c2.Real };  
  25.         }  
  26.  
  27.         public static Complex operator /(Complex c1, Complex c2)  
  28.         ...{  
  29.             return new Complex ...{ Real = -c1.Real * c2.Real + c1.Imaginary * c2.Imaginary,
  30.   Imaginary = -c1.Real *   c2.Imaginary + c1.Imaginary * c2.Real };  
  31.         }  
  32.     } 

由于C#運算符重載定義在定義它的對象實例上生效,所以可以改寫 operator - 和 operator / 運算,使其更加簡單。

  1. public static Complex operator -(Complex c1, Complex c2)  
  2. ...{  
  3.     return c1 + new Complex ...{ Real = c2.Real, Imaginary = c2.Imaginary };  
  4. }  
  5.  
  6. public static Complex operator /(Complex c1, Complex c2)  
  7. ...{  
  8.     return c1 * new Complex ...{ Real = -c2.Real, Imaginary = -c2.Imaginary };  

這樣我們就可以很方便的使用 Complex 類:

  1. var c1 = new Complex(3, 4), c2 = new Complex(1, 2);  
  2. var c3 = c1 * c2;  
  3. Complex c4 = c1 - c2 / c3 + c1; 

為了實現更加簡單的賦值,我們還需要實現隱式類型轉換(從 string 到 Complex)。

  1. public static implicit operator Complex(string value)  
  2. ...{  
  3.     value = value.TrimEnd('i');  
  4.     string[] digits = value.Split('+''-');  
  5.     return new Complex ...{ Real = Convert.ToDouble(digits[0]), 
  6. Imaginary = Convert.ToDouble(digits[1]) };  

可以通過如下代碼對實例進行賦值。

  1. Complex c = "4+5i"

在編譯器生成這些運算符重載代碼時,實際上會為每個已被重載運算符定義一個特殊名稱的方法。如 operator +,其實等同于如下代碼:

  1. [SpecialName]  
  2. public static Complex op_Addition(Complex c1, Complex c2)  
  3. ...{  
  4.     return new Complex ...{ Real = c1.Real + c2.Real, 
  5. Imaginary = c1.Imaginary + c2.Imaginary };  

C# 運算符重載一覽表

您可以在 C# 中對于以下運算符進行重載決策。

◆+, -, !, ~, ++, --, true, false

這些一元運算符可被重載。

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

這些二元運算符可被重載。

◆==, !=, <, >, <=, >=

這些關系運算符可被重載。

◆&&, ||

這些條件運算符不能被重載,但它們的值被 & 和 | 評估,而這兩個運算符可以重載。

◆[]

數組運算符不能被重載,但您可以定義索引器。

◆()

轉換運算符不能被重載,但您可以定義隱式類型轉換和顯式類型轉換運算符。

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

這些賦值運算符不能被重載,但他們的值,如 +=,會被 + 評估,而 + 可以被重載。

◆=, ., ?:, ->, new, is, sizeof, typeof

這些運算符不能被重載。

C# 中的運算符重載結論

C# 中的運算符重載是對重載概念的一個重要補充和發展,它針對對象關系中的多元關系和四則運算、關系運算等常規運算提供了重載支持,開發人員可以利用運算符重載優化利用到這些關系的實現代碼中,以提高生產力。

【編輯推薦】

  1. C#運算符重載實例淺析
  2. C#運算符重載概念及應用詳解
  3. C#運算符重載實現復數運算
  4. C#運算符重載實例解析
  5. C#運算符重載的一些總結
責任編輯:仲衡 來源: CSDN博客
相關推薦

2009-08-14 10:16:57

C#運算符重載

2009-08-12 10:47:03

C#運算符重載

2009-09-04 13:18:10

C#允許運算符重載

2009-08-12 10:27:12

C#運算符重載運算符重載實例

2009-08-12 10:56:47

C#運算符重載C#運算符重載實例

2009-08-12 12:46:11

C#運算符重載

2009-08-12 10:37:13

C#運算符重載

2009-08-19 16:59:25

C# 操作符

2009-08-11 15:51:08

C#運算符算術運算符

2009-08-12 09:30:10

C#??運算符

2009-08-12 15:02:49

C#賦值運算符簡單賦值運算符

2009-08-12 15:20:18

C#賦值運算符復合賦值運算符

2009-11-06 13:57:52

C#

2009-08-11 14:16:38

C# New運算符

2009-08-12 13:35:22

C#關系運算符

2009-09-01 10:08:57

C#運算符

2009-08-12 14:29:32

C#條件運算符

2009-08-12 14:49:33

C#移位運算符

2021-12-15 10:25:57

C++運算符重載

2011-07-15 01:34:36

C++重載運算符
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久影音先锋 | 欧美精品片 | 亚洲黄色一级毛片 | 欧美黄色一区 | 自拍偷拍视频网 | 国产精品美女视频 | 日韩一区中文字幕 | 产真a观专区 | 国产成人一区二区三区精 | 免费一区在线观看 | 亚洲国产aⅴ精品 | 欧美美女爱爱视频 | 亚洲91精品 | 午夜精品一区二区三区在线视 | 国产免费国产 | 伊人免费视频二 | 99视频网站 | 精品乱码一区二区 | 人人干在线| 国产偷自视频区视频 | 欧美激情综合 | 亚洲欧美日韩国产 | 日韩成人影院在线观看 | 中文字幕在线剧情 | 91午夜在线 | 影音先锋成人资源 | 性天堂网| 成人在线精品视频 | 欧美日韩视频在线第一区 | 亚洲精品91| 五月天婷婷丁香 | 日日操视频 | 日韩av一区在线观看 | 美女黄18岁以下禁止观看 | 色接久久 | 一级看片免费视频囗交动图 | 免费精品 | 在线国产一区 | 99视频在线 | 一区二区手机在线 | 伊人久久在线 |