【发布时间】:2009-09-20 17:00:32
【问题描述】:
假设您有两个不同的类,每个类都有自己的 Equals 实现;使用哪一个?如果他们中只有一个人有一个怎么办?还是一个都没有?以下任何行是否等效?
object .Equals( first, second )
first .Equals( second )
second .Equals( first )
我猜前两个可能是等价的,但我真的不知道。
它的真正作用是什么?
【问题讨论】:
假设您有两个不同的类,每个类都有自己的 Equals 实现;使用哪一个?如果他们中只有一个人有一个怎么办?还是一个都没有?以下任何行是否等效?
object .Equals( first, second )
first .Equals( second )
second .Equals( first )
我猜前两个可能是等价的,但我真的不知道。
它的真正作用是什么?
【问题讨论】:
基本上它做了三件事:
first.Equals(second) 检查值是否相等
如果两个值都具有良好的相等实现,则排序不应该重要,因为应该实现相等以使x.Equals(y) 隐含y.Equals(x)。但是,我安装的离线文档确实声明了 first.Equals(second) (或 objA.equals(objB) 使用实际参数命名)已指定。 online documentation 没有提到这一点,很有趣。
为了使所有这些具体化,实现可能如下所示:
public static bool Equals(object x, object y)
{
if (x == y) // Reference equality only; overloaded operators are ignored
{
return true;
}
if (x == null || y == null) // Again, reference checks
{
return false;
}
return x.Equals(y); // Safe as we know x != null.
}
【讨论】:
Object.Equals 和虚拟first.Equals(second) 之间的主要区别在于,如果first 是空引用,则后者将失败。
默认情况下,对象等效性由对象在内存中的地址确定。如果两个实例具有相同的内存地址,则它们是相等的。
但是,这可以在对象中重载,以便开发人员可以比较两个不在同一内存位置但仍被视为相等的对象。例如,如果您有一个数据访问层,其中每个对象都有来自数据库的数据记录 ID,您可以根据 ID 比较对象相等性。
您可以overload operators 生成此功能。
【讨论】: