** C# ** ** 中奇妙的操作符重载 ** ** **
细心的朋友可能发现, C# 虽然可以重载操作符,但和 C++ 比较起来,却有很大的不同。定义的时候重载操作符方法必须是 static ,而且至少有一个参数(一目和二目分别是一个和两个), C# 和 C++ 比起来,最重要的特征是: < 、 > ; == 、 != ; true 、 false 必须成对出现,即重载了“ < ”就必须重载“ > ”,重载了“ == ”就必须重载“! = ”,重载了“ true ”就必须重载“ false ”;另外,还必须实现基类 object 的两个虚方法: GetHashCode()和Equals( object obj)。
以下是程序代码,有些地方写得不完善,只能说仅仅说明了问题,不对之处请指教:
using System;
using System.Xml;
namespace ConsoleApplication8
{
///
1<summary>
2
3/// 姓名类
4
5/// </summary>
class Namer
{
private string FirstName;
private string LastName;
public Namer()
{
this .Init( null , null );
}
public Namer( string fn, string ln)
{
this .Init(fn,ln);
}
private void Init( string fn, string ln)
{
this .FirstName=fn;
this .LastName=ln;
}
///
1<summary>
2
3/// 重载运算符true
4
5/// </summary>
///
1<param name="n"/>
///
1<returns> 如果姓名中姓或名有一个为空,就返回假 </returns>
public static bool operator true (Namer n)
{
if (n.FirstName== null || n.LastName== null )
return false ;
else
return true ;
}
///
1<summary>
2
3/// 重载运算符false
4
5/// </summary>
///
1<param name="n"/>
///
1<returns></returns>
public static bool operator false (Namer n)
{
if (n.FirstName== null || n.LastName== null )
return false ;
else
return true ;
}
///
1<summary>
2
3/// 重载运算符==
4
5/// </summary>
///
1<param name="n1"/>
///
1<param name="n2"/>
///
1<returns></returns>
public static bool operator ==(Namer n1,Namer n2)
{
if (n1.FirstName==n2.FirstName && n1.LastName==n2.LastName)
return true ;
else
return false ;
}
///
1<summary>
2
3/// 重载运算符!=
4
5/// </summary>
///
1<param name="n1"/>
///
1<param name="n2"/>
///
1<returns></returns>
public static bool operator !=(Namer n1,Namer n2)
{
if (n1.FirstName!=n2.FirstName || n1.LastName !=n2.LastName)
return true ;
else
return false ;
}
///
1<summary>
2
3/// 重载运算符>
4
5/// </summary>
///
1<param name="n1"/>
///
1<param name="n2"/>
///
1<returns></returns>
public static bool operator >(Namer n1,Namer n2)
{
return (n1.FirstName.CompareTo(n2.FirstName)>0 && n1.LastName.CompareTo(n2.LastName)>0);
}
///
1<summary>
2
3/// 重载运算符 <
4
5/// </summary>
///
1<param name="n1"/>
///
1<param name="n2"/>
///
1<returns></returns>
public static bool operator <(Namer n1,Namer n2)
{
return (n1.FirstName.CompareTo(n2.FirstName)<0 && n1.LastName.CompareTo(n2.LastName)<0);
}
///
1<summary>
2
3/// 重写方法,必须有,后面的111是乱加的,你也可以写其它的
4
5/// </summary>
///
1<returns></returns>
public override int GetHashCode()
{
return base .GetHashCode()*111;
}
///
1<summary>
2
3/// 重写方法,必须有
4
5/// </summary>
///
1<param name="obj"/>
///
1<returns></returns>
public override bool Equals( object obj)
{
return base .Equals (obj);
}
///
1<summary>
2
3/// 重写方法,必须有
4
5/// </summary>
///
1<returns></returns>
public override string ToString()
{
return "姓:" + this .FirstName+ " 名:" + this .LastName;
}
public static void Main()
{
Namer n1= new Namer( "li" , "zanhong" );
Namer n2= new Namer( "ahang" , "aan" );
//Namer n2=new Namer("li","zanhong");
<span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Ro