使用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);
}
本文深入探讨了C#中操作符重载的实现方式,包括加法操作符的重载以及整型与分数之间的隐式和显式转换。详细解释了如何通过`operator`关键字来定义操作符行为,并且强调了实现类型转换时的`implicit`和`explicit`关键字的重要性。
463

被折叠的 条评论
为什么被折叠?



