IEquatable是否级联?

时间:2012-03-05 16:51:32

标签: c# class iequatable

我对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类上实现IEquatable接口,它会自动级联到该类中的任何对象,还是必须在所有类上显式实现接口?

如果我必须在所有类上实现接口,在将Person的实例与Person的另一个实例进行比较时,是否应该注意任何特定的“陷阱”?

3 个答案:

答案 0 :(得分:4)

对象之间的平等可以采用多种形式,具体取决于您需要什么。回答你的问题:

,仅仅因为Person实施IEquatable并不意味着SalaryInformation实施IEquatablePersonSalaryInformation之间的关系是一个组合,组合不关心接口实现。

Equals Person的实施因此取决于你何时考虑两个人是同一个人:

  • 如果他们拥有相同的名字和姓氏,他们是否相同?
  • 如果它们具有相同的SalaryInformation,它们是否相同?

此外,如果您希望能够比较对象的相等性,则需要记住一些指导原则:

  1. 平等是一种等价关系,即它是
    一个。自反
    湾对称和 C。传递的。
  2. 请记住,null不等于任何对象。
  3. 也始终覆盖GetHashCode
  4. 如果掌握了它,那么做起来并不难,但如果你从未这样做过,那么就会出现各种各样的问题。

答案 1 :(得分:1)

这完全取决于你自己的定义,当两个Person实例相等时!这里没有任何魔力,在IEquatable上实施Person不会以任何方式级联。

那么,如何在你的应用程序的上下文中将两个Person实例定义为相等?姓氏和姓氏的平等是否足够好?如果是这样,那就是你应该如何实现IEquatable。有时使用的其他替代方法是根据某些生成的主键或某些已知的唯一值(如国民保险号)定义相等性。

答案 2 :(得分:0)

是的,我会在你正在使用的每个课程上实现这一点。

但正如其他人评论的那样,这取决于你想要实现的目标。

如果你实现了Equals和GetHashCode(你需要两者),你应该正常尝试只在比较中包含只读字段。除此之外,你必须确保GetHashCode与Equals很好地匹配(例如,如果Equals返回true,则不返回不同的值),当然Equals应该是对称的。