一.对象的等值性和惟一性

 System.Object类型提供了一个Equals的虚方法,其目的为判断两个对象是否有个相同的"值".

    }

 

这也许是最简单的方法.

但有时间,它提供的默认实现对我们来说是不够的,必须重写Equals方法.

自己写的时候,要遵循以下4条规则:

1.Equals方法必须是自反的.也就是说,x.Equals(x)必须返回true.

2.   Equals方法必须是对称的.也就是说,x.Equals(y)和y.Equals(x)必须返回同样的值.

3.Equals方法必须是可传递的.也就是说,如果x.Equals(y)和y.Equals(z)都返回true,那么x.Equals(z)也必须返回     true.

4. Equals方法必须是前后一致的.也就是说,如果两个对象的值没有发生变化,多次调用Equals方法的返回值应该相同.

(一)为基类没有重写Object.Equals方法的引用类型实现Equals

 

ITPUB个人空间S.\ F$C*K|0~o
    }

 

这要注意的:

1.要比较引用类型的字段,我们应该调用Object的静态方法Equals方法.

    Objext的静态方法Equals方法是一个比较两个引用类型对象的辅助方法.采用这种方法比较,是因为即使两个字段出现了值为null的情况,代码仍会正常运行.

2.要比较值类型的字段,应该调用该字段类型的Equals方法.不应该调用Object的静态方法Equals方法.因为值类型对象的值永远不可能为null,并且调用Object的静态方法Equals会对值类型对象执行装箱操作.

(二)为基类重写了Object.Equals方法的引用类型实现Equals

 

ITPUB个人空间K0v:v m^(e8p
    }

 

如果调用base.Equals会导致调用Object.Equals方法,那么就不应该再调用它.这一点很重要.因为只有在两个引用指向同一个对象时,Object.Equals方法才会返回true.如果两个引用没有指向同一个对象,那么它将返回false.这样我们实现的Equals方法将总是返回false.

 当然,如果我们定义的类型直接继承自Object,我们就应该象第一段代码那样来实现Equals.如果我们定义的类型不是直接继承自Object,我们必须首先确定该类型的基类型是否重写了Equals方法.如果其中任何一个基类型重写了Equals方法,那么我们就应该象这段代码先base.Equals方法.


相关文章:

  • 2022-01-12
  • 2022-01-07
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-03
  • 2021-10-04
  • 2022-12-23
猜你喜欢
  • 2021-07-12
  • 2021-10-09
  • 2021-09-22
  • 2021-12-13
  • 2022-12-23
  • 2022-01-28
  • 2022-12-23
相关资源
相似解决方案