自定义类型的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);
}
}
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);
}
}
相关文章推荐
- 浮点性(float)转化为字符串类型 自定义实现和深入探讨C++内部实现方法
- 浮点性(float)转化为字符串类型 自定义实现和深入探讨C++内部实现方法
- 如何实现自定义hashcode和equals方法
- 用户自定义类型作为T,来实现Dictionary,HashSet时,必须重写GetHashCode 方法
- 为基类没有重写Object.Equals 方法的引用类型实现Equals
- XFire实现自定义类型参数传递和调用返回自定义类型方法
- HashSet中存方用户自定义数据类型数据,重写equals方法和hashCode方法
- Mybatis实现自定义类型转换器TypeHandler的方法
- JavaScript基于自定义函数判断变量类型的实现方法
- Android的程序关联和自定义类型文件的方法步骤和实现过程
- freemarker 实现自定义标签的方法
- Asp.Net实现无限分类生成表格的方法(后台自定义输出table)
- 程序集“XX” 中的类型“XX” 的方法“XX()” 没有实现
- QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
- 限制input输入类型(多种方法实现)
- 实现自定义保存方法,多表保存实现事务管理
- Android自定义View的实现方法,带你一步步深入了解View(四)
- java 工厂+策略+模板方法模式实现单接口多种类型文件解析
- 实现自定义文件类型处理