這篇文章將為大家詳細講解有關(guān)C#運算符重載是什么意思,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

蘭溪網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站從2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。
重載是面向?qū)ο笾械囊粋€重要概念,它是對象多態(tài)性的一種不完全體現(xiàn),人們通常所說的重載,往往指的是函數(shù)的重載。本文向讀者介紹一種新的重載模型——運算符重載。
為什么需要C#運算符重載
函數(shù)的重載為一個對象上的相同行為提供不同的參數(shù)方式,這樣,開發(fā)人員便可以使用這些不同的參數(shù)實現(xiàn)類似的功能。一組函數(shù)重載決策一般實現(xiàn)的功能是相同的,例如對 Object 對象上的 ToString() 方法就有幾個重載版本,雖然它們接受的參數(shù)不同,但卻都表達同一個行為的最終結(jié)果。參數(shù)的不同導致函數(shù)重載版本的簽名不同,這樣編譯器很容易知道需要調(diào)用那一個重載版本。這種技術(shù)給開發(fā)人員帶來了方便。
現(xiàn)在我們試圖對重載的定義進行推廣。先讓我們看看最簡單的例子,我們通常需要像這樣聲明并初始化一個值類型的變量:
int digit = 5; string sayHello = "Hello, World";
這里的“=”運算符,就是將右邊的值傳遞給左邊變量的賦值運算符。這里,5 的類型為 int,“Hello, World”的類型為 string,這與左邊被賦值的變量類型完全一致。
但對于上述的解釋,我們還可以這樣認為:5 的類型為 uint 或 byte,"Hello, World"的類型為 char[],那么如此一來,賦值運算左邊和右邊的類型就不在等同,那么編譯器如何處理呢?有人會說,這就是“隱式類型轉(zhuǎn)換”,這個答案確實很好,但隱式類型轉(zhuǎn)換的規(guī)則已經(jīng)被編譯器確定,如果賦值運算的兩端不遵循隱式類型轉(zhuǎn)換規(guī)則,則需要顯式類型轉(zhuǎn)換,例如:
char c = '2'; string s = (string)c; int i = (int)c;
這些顯式類型轉(zhuǎn)換并不適用于任何場合,也許人們希望在其自定義的類中也能用賦值、加減乘除等語法操作它們。
對象和對象之間是可能存在這種特殊的運算關(guān)系的,一個典型的例子就是“復數(shù)”對象。復數(shù)是一個值類型對象,它包含兩個 double 類型的域,兩個復數(shù)對象可以被加、減、乘、除和相等性判斷,但無法比較大小。我們試想可以如此操作復數(shù)類:
Complex c1, c2; c1 = new Complex(3, 4); c2 = "4+5i"; var c3 = c1 * c2 / -c1 + c2; if (c1 == c2) c3 = c1; else c3 = c2;
我們可以從這些代碼可以預見C#運算符重載所需要實現(xiàn)的功能:
1、支持隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換的重載決策。
2、支持基本二元運算符,如加、減、乘、除等。
3、支持基本一元運算符,如取負、取反、自增、自減等。
4、支持基本關(guān)系運算符,如大于、小于、等于和不等于等。
5、實現(xiàn)更加復雜的運算符,如三元運算、[]、()、位運算等。
事實上,運算符重載的提出就是為了解決這些問題。在 CLR 框架下的各種 CLR 語言,均不同程度的支持運算符重載。Visual Basic 在 8.0 版本上(也就是 Visual Studio 2005)也支持了運算符重載,運算符重載除了以上列出的優(yōu)點外,還具備如下特點。
1、使得代碼更加容易理解和閱讀。
2、可以利用現(xiàn)有運算符的優(yōu)先級關(guān)系規(guī)則處理對象之間的運算。
3、使得代碼更加靈活,對象可操作性更好。
4、開發(fā)人員可以舉一反三,因為他們熟悉了常規(guī)值類型上的運算符使用,這樣可以直接將這些規(guī)則引入到自定義對象上。
下面我們通過介紹復數(shù)類的定義,來深入 C# 語言中的運算符重載。
C# 運算符重載決策示例
下面的例子定義一個 Complex 類,實現(xiàn)了復數(shù)加、減、乘和除的四則運算。C# 中定義常規(guī)運算符的語法如下:
[public | private | protected | internal | internal protected] static <return type> | implicit | explicit operator ( )
下面是C#運算符重載(C# 3.0) 代碼。
struct Complex ...{ public double Real ...{ get; set; } public double Imaginary ...{ get; set; } public Complex(double real, double imaginary) : this() ...{ this.Real = real; this.Imaginary = imaginary; } public static Complex operator +(Complex c1, Complex c2) ...{ return new Complex ...{ Real = c1.Real + c2.Real, Imaginary = c1.Imaginary + c2.Imaginary }; } public static Complex operator -(Complex c1, Complex c2) ...{ return new Complex ...{ Real = c1.Real - c2.Real, Imaginary = c1.Imaginary - c2.Imaginary }; } public static Complex operator *(Complex c1, Complex c2) ...{ return new Complex ...{ Real = c1.Real * c2.Real - c1.Imaginary * c2.Imaginary, Imaginary = c1.Real * c2.Imaginary - c1.Imaginary * c2.Real }; } public static Complex operator /(Complex c1, Complex c2) ...{ return new Complex ...{ Real = -c1.Real * c2.Real + c1.Imaginary * c2.Imaginary, Imaginary = -c1.Real * c2.Imaginary + c1.Imaginary * c2.Real }; } }由于C#運算符重載定義在定義它的對象實例上生效,所以可以改寫 operator - 和 operator / 運算,使其更加簡單。
public static Complex operator -(Complex c1, Complex c2) ...{ return c1 + new Complex ...{ Real = c2.Real, Imaginary = c2.Imaginary }; } public static Complex operator /(Complex c1, Complex c2) ...{ return c1 * new Complex ...{ Real = -c2.Real, Imaginary = -c2.Imaginary }; }這樣我們就可以很方便的使用 Complex 類:
var c1 = new Complex(3, 4), c2 = new Complex(1, 2); var c3 = c1 * c2; Complex c4 = c1 - c2 / c3 + c1;
為了實現(xiàn)更加簡單的賦值,我們還需要實現(xiàn)隱式類型轉(zhuǎn)換(從 string 到 Complex)。
public static implicit operator Complex(string value) ...{ value = value.TrimEnd('i'); string[] digits = value.Split('+', '-'); return new Complex ...{ Real = Convert.ToDouble(digits[0]), Imaginary = Convert.ToDouble(digits[1]) }; }可以通過如下代碼對實例進行賦值。
Complex c = "4+5i";
在編譯器生成這些運算符重載代碼時,實際上會為每個已被重載運算符定義一個特殊名稱的方法。如 operator +,其實等同于如下代碼:
[SpecialName] public static Complex op_Addition(Complex c1, Complex c2) ...{ return new Complex ...{ Real = c1.Real + c2.Real, Imaginary = c1.Imaginary + c2.Imaginary }; }C# 運算符重載一覽表
您可以在 C# 中對于以下運算符進行重載決策。
◆+, -, !, ~, ++, --, true, false
這些一元運算符可被重載。
◆+, -, *, /, %, &, |, ^, <<, >>
這些二元運算符可被重載。
◆==, !=, <, >, <=, >=
這些關(guān)系運算符可被重載。
◆&&, ||
這些條件運算符不能被重載,但它們的值被 & 和 | 評估,而這兩個運算符可以重載。
◆[]
數(shù)組運算符不能被重載,但您可以定義索引器。
◆()
轉(zhuǎn)換運算符不能被重載,但您可以定義隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換運算符。
◆+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
這些賦值運算符不能被重載,但他們的值,如 +=,會被 + 評估,而 + 可以被重載。
◆=, ., ?:, ->, new, is, sizeof, typeof
這些運算符不能被重載。
關(guān)于“C#運算符重載是什么意思”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
當前名稱:C#運算符重載是什么意思
文章轉(zhuǎn)載:http://chinadenli.net/article24/ipjgce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、動態(tài)網(wǎng)站、電子商務(wù)、微信公眾號、ChatGPT、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)