HashSet
在没有参数的构造函数的 MSDN API 中,它声明
初始化 HashSet 类的新实例,该实例为空并使用集合类型的默认相等比较器。
集合类型(例如自定义类)的默认相等比较器是什么?
顺便说一句:仅仅是我还是 MSDN API 文档的解释真的有点薄?在阅读它时,我不止一次偶然发现这些问题。
这意味着它将使用返回的比较器作为集合EqualityComparer<T>.Default
的元素类型T
。
正如文档所述:
Default 属性检查 type 是否
T
实现了 System.IEquatable 接口,如果是,则返回使用该实现的 EqualityComparer。否则,它会返回一个 EqualityComparer,它使用由提供的 Object.Equals 和 Object.GetHashCode 的覆盖T
。
因此,对于您的自定义类型,它将使用GetHashCode
您定义的方法来定位集合中的项目。如果您已经实现IEquatable<T>
,它将IEquatable<T>.Equals(T)
用于相等,否则它将使用您的Equals(object)
方法。此方法默认引用类中定义的相等性object
。因此,如果您使用任一方法定义相等,则应确保也覆盖GetHashCode
。
默认情况下,它将委托给EqualityComparer<T>.Default
. 这将返回一个比较器,它可以比较两个类型的对象T
。
对于自定义类,它按以下顺序执行一些操作:
IEquatable<T>
了,它将委托给该类的该接口的实现Equals
定义了一个方法,它将使用该方法