日期:2014-05-17 浏览次数:20884 次
运算符重载
C#运算符被定义为使用预定义类型作为操作数来工作。如果面对一个用户定义类型,运算符完全不知道如何处理它。运算符重载运行定义C#运算符操作自定义类型的操作数。
运算符重载只能用于类和结构。
为类或结构重载一个运算符x,可以声明一个名称为operator x的方法并实现它的行为。
一元运算符的重载方法带一个单独的class或struct类型的参数。
二元运算符的重载方法带两个参数,其中至少有一个必须是class或struct类型。
?
运算符重载方法必须被声明为:
带static和public两个修饰符。
类和结构的成员,该类或结构是它的一个操作数。
?
运算符重载的限制:
可重载的一元运算符:+,-,!,~,++,--,true,false
可重载的二元运算符:+,-,*,/,%,&,|,^,<<,>>,==,!=,>,<,>=,<=
?
递增和递减运算符是可重载的。但和预定义转换不同,重载运算符的前置和后置之前没有区别。
运算符重载不能做如下事情:
创建新运算符。
改变运算符的语法。
重新定义运算符如何让处理预定义类型。
改变运算符的优先级或结合性。
?
例:
?
class LimiterInt{
? ? const int MaxValue=100;
const int MinValue=0;
public static LimiterInt operator -(LimiterInt x)
{
? ?LimiterInt li=new LimiterInt();
li.TheValue=0;
return li;
}
public static LimiterInt operator -(LimiterInt x,LimiterInt y)
{
? ?LimiterInt li=new LimiterInt();
li.TheValue=x.TheValue-y.TheValue;
return li;
}
public static LimiterInt operator +(LimiterInt x,LimiterInt y)
{
? ?LimiterInt li=new LimiterInt();
li.TheValue=x.TheValue+y.TheValue;
return li;
}
?
? ? ? ? private int _TheValue=0;
public int TheValue
{
? ?get{return _TheValue;}
set
{
? ?if(value<MinValue)
? ?_TheValue=0;
else
? ?_TheValue=value>MaxValue?MaxValue:true;
}
}
?
}
?
?
class Program
{
? ? static void main(){
? ? ? ? LimiterInt li1=new LimiterInt();
LimiterInt li2=new LimiterInt();
LimiterInt li3=new LimiterInt();
li1.TheValue=10;li2.TheValue=26;
li3=-li;
Console.WriteLine("-{0}={1}",li1.TheValue,li3.TheValue);
li3=li2-li1;
Console.WriteLine("{0}-{1}={2}",li2.TheValue,li1.TheValue,li3.TheValue);
li3=li2+li1;
Console.WriteLine("{0}+{1}={2}",li2.TheValue,li1.TheValue,li3.TheValue);
? ? }
}