以前,我认为有可能并且有必要为您的类重新定义 Equals。但是我遇到了其他信息,覆盖可能会导致某些集合出现问题。
你什么时候应该重写
object.Equals()你的课程?真的,如果你想根据本质比较类的两个对象是否等价,你需要创建一个单独的方法吗?
第三方课程呢?原来他们没有提供实体等价性的比较手段?
我对实体等价性的理解是什么。假设有一堂课
public class Country
{
public Country (string name)
{
this.name = name;
}
private readonly string name;
public string Name { get {return name;}}
}
public void Main()
{
var c1 = new Country("Россия");
var c2 = new Country("Россия");
}
所以 c1 和 c2 对我来说是等价的,因为 我的世界里不能有两个同名的国家。恰好我们创建了两个实例,但它们本质上是相同的..
如您所知,默认情况下 .NET通过引用比较引用类型的对象,以及值类型的对象 -逐位(按值读取)。
这在您的示例中导致了什么?事实上,
c1他们c2被认为是不平等的。随着 t.z. 业务逻辑,您正确地注意到它们是相等的,但是,环境对业务逻辑一无所知。因此得出结论:
Equals()在需要根据某些特定规则将对象视为相等的情况下,必须重写该方法。特别是,当您将该类型的对象用作字典键、哈希集元素或某些集合的元素并调用Contains(). 还值得注意的是,与 k 配对时Equals(),您需要覆盖GetHashCode().是的需要。因为相同类型的两个对象相等的规则,粗略地说,是业务规则,适用于您的应用程序。运行时对它们一无所知,但作为开发人员的您知道它们。
对于第三方类实例的自定义比较,使用接口
IEqualityComparer<T>及其实现。BCL 包括一些开箱即用的实现(例如,用于不区分大小写的字符串比较)。在大多数情况下,您需要创建自己的比较器。object.Equals()如果您的类的实例有一个真实的方法来确定所有应用程序代码通用的等效性,则值得重新定义。重写时object.Equals(),一定要重写方法,并以这样的方式object.GetHashCode()为等效对象GetHashCode()返回相同的值。不,覆盖
object.Equals()不是唯一可用的方法。如果您需要在一个特定案例中指定等效性的定义,而不是在整个应用程序中,那么您可以通过IEqualityComparer<T>. 几乎所有标准集合都允许您使用IEqualityComparer<T>- 作为特定查找方法的参数,或作为集合构造函数的参数。对于第三方课程 - 请参阅 2。