C#中 值的比较
1.运算符重载
要进行运算符的重载,可以给类添加运算符类型成员(他们必须是static)。有些运算符有多种用途(例如-有一元和两元两种功能,)因此我们还要指定处理了多少个操作数,以及这些操作数的类型。一般情况下,操作数的类型与定义运算符的类相同,但也可以定义处理混合类型的运算符。
先看例子:
<br/>public class AddClass1<br/>{<br/> public int val;<br/>}<br/>
这个仅仅是int值的一个包装器(wrapper)。
对于这个类,下面的代码不能编译。
<br/>AddClass1 op1=new AddClass1();<br/>op1=5;<br/>AddClass1 op2=new AddClass1();<br/>op2=5;<br/>AddClass1 op3=op1+op2;<br/>
因为+运算符不能应用于AddClass1的操作数,因为我们没有定义要执行的操作。
下面的代码可以执行,但是得不到希望的结果。
<br/>AddClass1 op1=new AddClass1();<br/>op1=5;<br/>AddClass1 op2=new AddClass1();<br/>op2=5;<br/>AddClass1 op3=op1==op2;<br/>
使用==二元运算符来比较op1和op2,看看他们是否引用同一个对象,而不是验证他们的值是否相等。在上述代码中即使op1和op2相等,op3也是false。
要重载+运算符,要使用下面的代码:
<br/><br/>public class AddClass1<br/>{<br/> public int val;<br/> <br/> public static AddClass1 operator +(AddClass1 op1,AddClass1 op2)<br/> {<br/> AddClass1 returnVal=new AddClass1();<br/> returnVal.val=op1.val+op2.val;<br/> return returnVal;<br/> }<br/>}<br/><br/>
运算符重载看起来与标准静态方法声明类似,但它们使用关键字operator和运算符本身,而不是一个方法名。
一元运算符和二元运算符差不多,一元运算符只需要一个参数。
也可以使用混合运算符,例如:
<br/><br/>public class AddClass1<br/>{<br/> public int val;<br/> <br/> public static AddClass3 operator +(AddClass1 op1,AddClass1 op2)<br/> {<br/> AddClass1 returnVal=new AddClass1();<br/> returnVal.val=op1.val+op2.val;<br/> return returnVal;<br/> }<br/>}<br/><br/>public class AddClass2<br/>{<br/> public int val;<br/>}<br/><br/>public class AddClass3<br/>{<br/> public int val;<br/>}<br/><br/>
下面的代码就可以执行:
<br/>AddClass1 op1=new AddClass1();<br/>op1=5;<br/>AddClass3 op2=new AddClass2();<br/>op2=5;<br/>AddClass3 op3=op1+op2;<br/>
但是如果吧签名相同的运算符添加到AddClass2中,上面的代码就会失败,因为它不知道要使用那个运算符。因此应注意,不要吧签名相同的运算符添加到多个类中。
混合了类型,操作数的顺序应与运算符重载的的参数顺序相同。如果使用了重载的运算符,和顺序错误的错作数,操作就会失败,下面的就会失败。
[/CODE_LITE]AddClass3 op3=op2+op1;[/CODE_LITE]
下面的运算符可以重载:
◆一元运算符:+,—,!,~,++,--,true,flase
◆二元运算符:+,—,*,/,%,&,|,^,<<,>>
◆比较运算符:==,!=,<,>,<=,>=
注意:如果重载true和flase ,就可以在布尔表达式中使用类,例如:if(op1){};
一些运算符比较成对的重载,如<、>必须成对重载,
还有=、!=,但这个运算符常常需要重写,Object.Equals()和Object.GetHashCode()。
它需要下述非静态重写方法:
<br/><br/>public class AddClass1<br/>{<br/> public int val;<br/> <br/> public static bool operator ==(AddClass1 op1,AddClass1 op2)<br/> {<br/> return (op1.val=op2.val);<br/> }<br/><br/> public static bool operator !=(AddClass1 op1,AddClass1 op2)<br/> {<br/> return !(op1==op2);<br/> }<br/><br/> public override bool Equals(object op1)<br/> {<br/> return val ==((AddClass1).op1).val;<br/> }<br/><br/> public override int GetHashCode()<br/> {<br/> return val;<br/> }<br/><br/>}<br/><br/>
需要注意的是Equals()使用object类型参数。我们需要使用这个签名,否则就将重载这个方法,而不是重写它。
0 条留言
我要留言