首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IEquatable会级联吗?

IEquatable会级联吗?
EN

Stack Overflow用户
提问于 2012-03-06 00:51:32
回答 3查看 144关注 0票数 1

关于IEquatable,我有一个非常简单的问题。给定以下基本类:

代码语言:javascript
复制
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的另一个实例时,是否有什么特殊的“陷阱”需要我注意?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-06 00:55:04

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

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

因此,PersonEquals实现取决于您何时认为两个人是相同的:

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

此外,如果您希望能够比较对象的相等性,则需要记住以下几条准则:

  1. 等式是一种等价关系,即

a.自反式,

b.对称和

c. transitive.

  • Remember表示null也不等于任何object.

  • Always覆盖GetHashCode

如果你掌握了它的诀窍,做好它并不难,但是如果你从来没有做过它,所有的问题都会出现。

票数 4
EN

Stack Overflow用户

发布于 2012-03-06 00:54:58

这完全取决于您自己对何时两个Person实例相等的定义!这里没有什么神奇之处,在Person上实现IEquatable也不会以任何方式级联。

那么,如何将两个Person实例定义为在应用程序上下文中相等呢?姓氏和名字相等就足够了吗?如果是这样的话,这就是你实现IEquatable的方式。有时使用的其他替代方案是基于一些生成的主键定义相等,或者一些已知的唯一值,如国家保险号。

票数 1
EN

Stack Overflow用户

发布于 2012-03-06 00:55:31

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

但正如其他人评论的那样,这在一定程度上取决于你试图实现的目标。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9570553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档