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

如果我们要创建一个类,无论是引用还是值类型的,经常要实现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);
            }
        }

 

posted @ 2014-06-14 23:27  zzg168  阅读(292)  评论(0)    收藏  举报