使用 operator 關鍵字來重載內置運算符,或提供類或結構聲明中的用戶定義轉換。
C#中,操作符都是一些靜態方法,其返回值表示操作結果,其參數是操作數.當我們為一個類創建操作符時,我們稱為"重載(OverLoad)"該操作符,與成員方法重載很像.要重載加法操作符(+),應這樣寫:
public static Fraction operator+(Fraction lhs,Fraction rhs);
將參數取名為lhs和rhs是我的習慣,參數名lhs代表"lefthand side"(左手邊),這樣可以提醒我第一參數代表操作的左邊.類似的,rhs代表"righthand side"(右手邊).
C#的操作符號重載語法是在要重載的操作符後寫上關鍵字operator.該關鍵字是一個方法修飾符.因此要重載加法操作符(+),應寫成operator+.
C#可以隱式地將int轉換long,並允許顯式地將long轉換為int.int到long是隱式轉換,因為任何int都可以適應long的內存表示.而逆操作,從long到int,必須是顯式的(要用強制轉換操作符),因為轉換可能使信息丟失:
int myInt = 5;
long myLong;
myLong = myInt; //隱式
myInt = (int) myLong; //顯式
對分數可能也需要相同的功能.對於給定的int,可以支持隱式的轉換為分數,因為整數值等於值除以1(如 15= =15/1).
對於給定分數,可以提供顯式轉換為整數,只要允許值可以取整.因此,9/4可以轉換為整數值2.
提示:關鍵字implicit用於轉換肯定成功,不會丟失信息的時候;否則就用explicit.
public static implicit operator Fraction(int theInt){
return new Fraction(theInt);
}
public static explicit operator int(Fraction theFraction){
return theFraction.numerator/theFraction.denominator;
}
轉換操作符號後是等於操作符(==)和不等於操作符(!=).請記住,如果實現了其中一個,必須實現另一個.
public static bool operator ==(Fraction lhs,Fraction rhs){
Console.WriteLine("In operator ==");
if (lhs.denominator == rhs.denominator && lhs.numerator == rhs.numerator)
return true;
return false;
}
public static bool operator !=(Fraction lsh,Fraction rhs){
Console.WriteLine("In operator !=");
return !(lhs == rhs);