集合类型的默认相等比较器是什么?

本文关键字:比较器 是什么 默认 集合类 类型 集合 | 更新日期: 2023-09-27 18:19:13

在没有参数的HashSet构造函数的MSDN API中,它声明

初始化HashSet类的新实例,该实例为空和对集合类型使用默认的相等比较器。

set类型(例如自定义类)的默认相等比较器是什么?

顺便说一句:是只有我这么认为还是MSDN API文档的解释真的有点薄?在阅读这本书的时候,我不止一次被这样的问题绊倒。

集合类型的默认相等比较器是什么?

表示它将使用EqualityComparer<T>.Default返回的比较器来比较集合的元素类型T

如文档所述:

Default属性检查类型T是否实现系统。可等价接口,如果是,则返回使用那个实现的EqualityComparer。否则,它返回一个equals比较器,该比较器使用的重写对象。等号和对象。GetHashCode由T提供。

所以对于您的自定义类型,它将使用您定义的GetHashCode方法来定位集合中的项。如果你已经实现了IEquatable<T>,它将使用IEquatable<T>.Equals(T)进行相等,否则它将使用你的Equals(object)方法。此方法默认引用在object类中定义的相等性。因此,如果您使用任何一种方法定义相等性,则应确保也覆盖GetHashCode

默认情况下,将委托给EqualityComparer<T>.Default。返回一个比较器,可以比较两个类型为T的对象。

对于自定义类,它按以下顺序做一些事情:

  • 如果类实现了IEquatable<T>,它将委托给类实现这个接口
  • 如果类定义了Equals方法,它将使用
  • 作为最后的手段,它将使用引用相等性