您的位置:首页 > 其它

自定义类型的equals方法的实现

2010-08-05 00:03 369 查看
总所周知,如果我们要创建一个类,无论是引用还是值类型的,经常要实现equals方法,下面把这两种一般的实现方式写在这里

1.引用类型的实现

class MyRefType : BaseType {
RefType refobj; //引用类型的对象
ValType valobj; //值类型的对象
public override bool Equals(object obj)
{
//当基类实现了equals时,首先要调用基类的equals方法,然后再进行别的,如果基类没有重写equals方法,那么这个判断可以去掉
if (!base.Equals(obj)) return false;
//因为this不肯能null,所以如果obj为null,将不可能相等
if (obj == null) {
return false;
}
//如果两个对象的类型不一样,将不可能相等
if (this.GetType() != obj.GetType()) return false;
//
MyRefType other = (MyRefType )obj;
if (!Object.Equals(refobj, other.refobj)) return false; //引用类型中无论是什么类型那个的变量都可以用object的静态equals方法进行判断,但是值类型的类的equals方法在这里是有区别的,引用可以用,但是值类型变量就改变了
if (!Object.Equals(valobj, other.valobj)) return false;
return true;
}
//当重写了equals方法是,一定要“==”和“!=”进行重写
public static Boolean operator ==(MyRefType o1, MyRefType o2) {
return object.Equals(o1,o2);
}
public static Boolean operator !=(MyRefType o1, MyRefType o2) {
return !(o1 == o2);
}

}

2.值类型equals方法的实现

值类型中一定要实现两个equals方法,一个是强类型的,一个是弱类型的。

如果只有弱类型的话,会导致equals过多的装箱与拆箱操作,影响程序的性能,并且强类型的更加的安全。

实现代码:

struct MyValType{
RefType refobj;//引用类型的变量
ValType valobj;//值类型的变量
public override bool Equals(object obj)
{
if (!(obj is MyValType)) { //通过is运算符判断
return false;
}
return this.Equals((MyValType )obj ); //调用强类型equals方法,会装箱
}
//实现一个强类型的Equals
public Boolean Equals(MyValType obj) {
if(!object .Equals(this.refobj ,obj .refobj )) return false; //在值类型中,引用类型变量的比较
if (!this.valobj.Equals(obj.valobj)) return false; //在值类型中,值类型变量的比较
return true;
}

public static Boolean operator==(MyValType o1,MyValType o2){
return o1.Equals(o2);
}

public static Boolean operator !=(MyValType o1, MyValType o2) {
return !(o1==o2);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: