关于IEquatable,我有一个非常简单的问题。给定以下基本类:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public SalaryInformation AnnualSalaryInformation { get; set; }
}
public class SalaryInformation
{
public string TaxCode { get; set; }
public string SalaryBand { get; set; }
public BankInformation AccountInfo { get; set; }
}
public class BankInformation
{
public string SortCode { get; set; }
public string AccountNumber { get; set; }
}如果我想将Person对象与Person对象进行比较,我该怎么做呢?如果我在Person类上实现IEquatable接口,它会自动级联到该类中的任何对象,还是必须显式地在所有类上实现该接口?
如果我必须在所有类上实现接口,那么在比较Person的实例与Person的另一个实例时,是否有什么特殊的“陷阱”需要我注意?
发布于 2012-03-06 00:55:04
对象之间的相等可以采用多种形式,具体取决于您所需要的内容。回答你的问题:
No,仅仅因为Person实现了IEquatable并不意味着SalaryInformation实现了IEquatable。Person和SalaryInformation之间是一种组合关系,组合并不关心接口的实现。
因此,Person的Equals实现取决于您何时认为两个人是相同的:
SalaryInformation,他们是否也相同?此外,如果您希望能够比较对象的相等性,则需要记住以下几条准则:
a.自反式,
b.对称和
c. transitive.
null也不等于任何object.
GetHashCode。如果你掌握了它的诀窍,做好它并不难,但是如果你从来没有做过它,所有的问题都会出现。
发布于 2012-03-06 00:54:58
这完全取决于您自己对何时两个Person实例相等的定义!这里没有什么神奇之处,在Person上实现IEquatable也不会以任何方式级联。
那么,如何将两个Person实例定义为在应用程序上下文中相等呢?姓氏和名字相等就足够了吗?如果是这样的话,这就是你实现IEquatable的方式。有时使用的其他替代方案是基于一些生成的主键定义相等,或者一些已知的唯一值,如国家保险号。
发布于 2012-03-06 00:55:31
是的,我会在你使用的每个类上实现这一点。
但正如其他人评论的那样,这在一定程度上取决于你试图实现的目标。
如果你实现了Equals和GetHashCode (两者都需要),你通常应该试着在比较中只包含只读字段。除此之外,您还必须确保GetHashCode很好地处理Equals (例如,如果Equals返回true,则不返回不同的值),当然Equals应该是对称的。
https://stackoverflow.com/questions/9570553
复制相似问题