比较两个对象。

14

如果我有一个复杂对象,那么编写比较两个实例是否相同的代码的最佳实践模式是什么

3个回答

18

实现IEquatable接口。此接口定义了一个通用方法,值类型或类通过实现该方法来创建特定于类型的方法,以确定实例之间的相等性。别忘了同时重写Equals(object)方法。

更多信息请参见:http://msdn.microsoft.com/en-us/library/ms131187.aspx


这与IComparable有何不同? - leora
IEquatable只会告诉你它们是否相同。IComparable将给你一个相对顺序。对于那些没有排序但是可比较的对象(例如图像),你不能使用IComparable。 - tvanfosson
".Equals()和==是一样的吗?" - leora
1
不,它并不是。这只是一个简单的引用比较。更多信息请参见: http://msdn.microsoft.com/en-us/library/53k8ybth(VS.80).aspx - Ray Booysen
更多信息,它执行一个简单的引用比较,除非你重载了 == 运算符。 - Ray Booysen

2

我认为答案高度取决于具体问题。例如,您可能只想在所有属性都相等的情况下将对象视为相等。这可能是因为每个对象没有唯一标识属性的情况。如果有这样的属性(或属性),比如ID或ID和版本,可以唯一标识该类型的每个对象,则只需基于该属性(或属性)进行比较。

然而,基本模式应该是这样的:

if their references are equal (includes both null)
   return true
else if one object is null
   return false
else
   return value based on relevant properties

注意,如果你重写了Equals运算符,你也应该重写GetHashCode()方法,以便等价对象的哈希码相同。这将确保在将对象用作键时,使用哈希码来确定重复键的数据结构能够正常工作。

0

既然你提到了一个复杂对象,请确保复杂对象中的所有组合对象都实现了tvanfosson所提到的equals(Object)方法。最后,利用所有组合对象的equals方法来实现复杂对象的equals方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接