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 条留言

我要留言
(必填)
(必填,绝不公开)