成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C#運(yùn)算符重載是什么意思

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

蘭溪網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)建站從2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站

重載是面向?qū)ο笾械囊粋€(gè)重要概念,它是對(duì)象多態(tài)性的一種不完全體現(xiàn),人們通常所說(shuō)的重載,往往指的是函數(shù)的重載。本文向讀者介紹一種新的重載模型——運(yùn)算符重載。

為什么需要C#運(yùn)算符重載

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

現(xiàn)在我們?cè)噲D對(duì)重載的定義進(jìn)行推廣。先讓我們看看最簡(jiǎn)單的例子,我們通常需要像這樣聲明并初始化一個(gè)值類型的變量:

int digit = 5;  string sayHello = "Hello, World";

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

但對(duì)于上述的解釋,我們還可以這樣認(rèn)為:5 的類型為 uint 或 byte,"Hello, World"的類型為 char[],那么如此一來(lái),賦值運(yùn)算左邊和右邊的類型就不在等同,那么編譯器如何處理呢?有人會(huì)說(shuō),這就是“隱式類型轉(zhuǎn)換”,這個(gè)答案確實(shí)很好,但隱式類型轉(zhuǎn)換的規(guī)則已經(jīng)被編譯器確定,如果賦值運(yùn)算的兩端不遵循隱式類型轉(zhuǎn)換規(guī)則,則需要顯式類型轉(zhuǎn)換,例如:

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

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

對(duì)象和對(duì)象之間是可能存在這種特殊的運(yùn)算關(guān)系的,一個(gè)典型的例子就是“復(fù)數(shù)”對(duì)象。復(fù)數(shù)是一個(gè)值類型對(duì)象,它包含兩個(gè) double 類型的域,兩個(gè)復(fù)數(shù)對(duì)象可以被加、減、乘、除和相等性判斷,但無(wú)法比較大小。我們?cè)囅肟梢匀绱瞬僮鲝?fù)數(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;

我們可以從這些代碼可以預(yù)見(jiàn)C#運(yùn)算符重載所需要實(shí)現(xiàn)的功能:

1、支持隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換的重載決策。

2、支持基本二元運(yùn)算符,如加、減、乘、除等。

3、支持基本一元運(yùn)算符,如取負(fù)、取反、自增、自減等。

4、支持基本關(guān)系運(yùn)算符,如大于、小于、等于和不等于等。

5、實(shí)現(xiàn)更加復(fù)雜的運(yùn)算符,如三元運(yùn)算、[]、()、位運(yùn)算等。

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

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

2、可以利用現(xiàn)有運(yùn)算符的優(yōu)先級(jí)關(guān)系規(guī)則處理對(duì)象之間的運(yùn)算。

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

4、開發(fā)人員可以舉一反三,因?yàn)樗麄兪煜ち顺R?guī)值類型上的運(yùn)算符使用,這樣可以直接將這些規(guī)則引入到自定義對(duì)象上。

下面我們通過(guò)介紹復(fù)數(shù)類的定義,來(lái)深入 C# 語(yǔ)言中的運(yùn)算符重載。

C# 運(yùn)算符重載決策示例

下面的例子定義一個(gè) Complex 類,實(shí)現(xiàn)了復(fù)數(shù)加、減、乘和除的四則運(yùn)算。C# 中定義常規(guī)運(yùn)算符的語(yǔ)法如下:

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

下面是C#運(yùn)算符重載(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#運(yùn)算符重載定義在定義它的對(duì)象實(shí)例上生效,所以可以改寫 operator - 和 operator / 運(yùn)算,使其更加簡(jiǎn)單。

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;

為了實(shí)現(xiàn)更加簡(jiǎn)單的賦值,我們還需要實(shí)現(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]) };  }

可以通過(guò)如下代碼對(duì)實(shí)例進(jìn)行賦值。

Complex c = "4+5i";

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

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

C# 運(yùn)算符重載一覽表

您可以在 C# 中對(duì)于以下運(yùn)算符進(jìn)行重載決策。

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

這些一元運(yùn)算符可被重載。

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

這些二元運(yùn)算符可被重載。

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

這些關(guān)系運(yùn)算符可被重載。

◆&&, ||

這些條件運(yùn)算符不能被重載,但它們的值被 & 和 | 評(píng)估,而這兩個(gè)運(yùn)算符可以重載。

◆[]

數(shù)組運(yùn)算符不能被重載,但您可以定義索引器。

◆()

轉(zhuǎn)換運(yùn)算符不能被重載,但您可以定義隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換運(yùn)算符。

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

這些賦值運(yùn)算符不能被重載,但他們的值,如 +=,會(huì)被 + 評(píng)估,而 + 可以被重載。

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

這些運(yùn)算符不能被重載。

關(guān)于“C#運(yùn)算符重載是什么意思”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

當(dāng)前名稱:C#運(yùn)算符重載是什么意思
文章轉(zhuǎn)載:http://jinyejixie.com/article24/ipjgce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站電子商務(wù)、微信公眾號(hào)ChatGPT、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
武穴市| 治县。| 南阳市| 洛扎县| 余江县| 依安县| 枣庄市| 余江县| 科尔| 保定市| 本溪市| 房产| 西林县| 来安县| 南涧| 辉县市| 宣化县| 梅州市| 扬州市| 自治县| 通化市| 万宁市| 靖边县| 马公市| 吴江市| 松滋市| 揭阳市| 奉节县| 井研县| 湘乡市| 扶绥县| 北流市| 崇左市| 昌邑市| 江都市| 林甸县| 辽宁省| 安溪县| 句容市| 来凤县| 梨树县|