C#操作符重載的那點(diǎn)事兒
C#操作符重載是什么?
是指允許用戶使用用戶定義的類型編寫表達(dá)式的能力。
例如,通常需要編寫類似于以下內(nèi)容的代碼,以將兩個(gè)數(shù)字相加。很明顯,sum 是兩個(gè)數(shù)字之和。
int i = 5;
int sum = i + j;
如果可以使用代表復(fù)數(shù)的用戶定義的類型來(lái)編寫相同類型的表達(dá)式,那當(dāng)然是***不過(guò)了:
Complex i = 5;
Complex sum = i + j;
運(yùn)算符重載允許為用戶定義的類型重載(即指定明確的含義)諸如“+”這樣的運(yùn)算符。如果不進(jìn)行重載,則用戶需要編寫以下代碼:
Complex i = new Complex(5);
Complex sum = Complex.Add(i, j);
此代碼可以很好地運(yùn)行,但 Complex 類型并不能象語(yǔ)言中的預(yù)定義類型那樣發(fā)揮作用。
在我看來(lái)是操作符重載是讓struct、class、Interface等能夠進(jìn)行運(yùn)算。
如時(shí)實(shí)現(xiàn)C#操作符重載。
先寫關(guān)鍵詞public和static,后跟返回類型,后跟operator關(guān)鍵詞,后跟要聲明的操作符符號(hào),***在對(duì)一對(duì)圓括號(hào)中添加恰當(dāng)?shù)膮?shù)。
如下例中的struct Hour中的public static Hour operator+ (Hour lhs,Hour rhs){...}
C#操作符重載方法:
1、編寫操作符重載方法。
2、實(shí)例化后,進(jìn)行操作符運(yùn)算
下邊用C#操作符重載代碼進(jìn)行說(shuō)明:
- class Program
- {
- static void Main(string[] args)
- {
- Hour hrValue1 = new Hour(10);
- Hour hrValue2 = new Hour(20);
- //2、得到兩個(gè)Hour相加結(jié)果
- Hour hrSum = hrValue1 + hrValue2;
- //得到Hour+Int的結(jié)果
- Hour hrSumInt = hrValue1 + 10;
- //得到Int+Hour的結(jié)果
- Hour hrIntSum = 11 + hrValue2;
- Console.WriteLine("hrValue1 + hrValue2 = {0}", hrSum.iValue);
- Console.WriteLine("hrValue1 + 10 = {0}", hrSumInt.iValue);
- Console.WriteLine("11 + hrValue2 = {0}", hrIntSum.iValue);
- Console.ReadKey();
- }
- struct Hour
- {
- private int value;
- //此構(gòu)造函數(shù)根據(jù)int值創(chuàng)建Hour類 ,C#操作符重載
- public Hour(int iValue)
- {
- this.value = iValue;
- }
- //定義一個(gè)屬性,便于取用value值
- public int iValue
- {
- get
- {
- return value;
- }
- } //C#操作符重載
- //1、聲明一個(gè)二元操作符,將兩個(gè)Hour類加到一起
- public static Hour operator+ (Hour lhs,Hour rhs)
- {
- return new Hour(lhs.value + rhs.value);
- }
- /*
- 操作符是public的。所有操作符都必須是public的
- 操作符是static的。所有操作符都必須是static的,操作永遠(yuǎn)不具有多態(tài)性,
- 面且不能使用virtual、abstract、override或者sealed修飾符。
- 二元操作符(比如+)有兩個(gè)顯式參數(shù);一元操作符有一個(gè)顯式的參數(shù)
- 我們有了public Hour(int iValue)構(gòu)造函數(shù),就可以將一個(gè)int與Hour相加,只是首先要將int轉(zhuǎn)換成為Hour
- hour a= ;
- int b= ;
- Hour sum=a+new Hour(b);
- 雖然上述代碼完全有效,但相較于讓一個(gè)Hour和一個(gè)int直接相加它即不清晰也不準(zhǔn)確。
- 為了使Hour可以+ int,必須聲明一個(gè)二元操作符+,它的***個(gè)參數(shù)是Hour,第二個(gè)參數(shù)是一個(gè)int。
- C#操作符重載
- */
- public static Hour operator+ (Hour lhs,int rhs)
- {
- return lhs + new Hour(rhs);
- }
- //使一個(gè)int 可以+hour。
- public static Hour operator +(int lhs, Hour rhs)
- {
- return new Hour(lhs)+rhs;
- }
- }
- }
C#操作符重載示例2:
- struct Hour
- {
- public int iValue;
- //構(gòu)造函數(shù)
- public Hour(int initialValue)
- {
- this.iValue = initialValue;
- }
- //1、定義操作符重載(一元操作符)
- public static Hour operator ++ (Hour huValue)
- {
- huValue.iValue++;
- return huValue;
- } //C#操作符重載
- //==操作符是二元操作符,必須帶有兩個(gè)參數(shù)
- public static bool operator==(Hour lhs,Hour rhs)
- {
- return lhs.iValue == rhs.iValue;
- }
- public static bool operator!=(Hour lhs,Hour rhs)
- {
- return lhs.iValue != rhs.iValue;
- }
- }
- //++操作符有前綴和后綴的形式,C#能智能地為前綴后后綴使用同一個(gè)操作符。
- static void Main(string[] args)
- {
- //2、實(shí)例化類 ,C#操作符重載
- Hour hu = new Hour(10);
- //3、
- //操作符重載
- hu++;
- //輸出重載后的結(jié)果
- Console.WriteLine("Hu++ = {0}", hu.iValue);
- //C#操作符重載
- ++hu;
- //輸出重載后的結(jié)果
- Console.WriteLine("Hu++ = {0}", hu.iValue);
- Console.ReadKey();
- }
C#操作符重載的基本內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)C#操作符重載有所幫助。
【編輯推薦】