【问题标题】:C#: How does the static object.Equals check for equality?C#:静态 object.Equals 如何检查相等性?
【发布时间】:2009-09-20 17:00:32
【问题描述】:

假设您有两个不同的类,每个类都有自己的 Equals 实现;使用哪一个?如果他们中只有一个人有一个怎么办?还是一个都没有?以下任何行是否等效?

object .Equals( first, second )
first .Equals( second )
second .Equals( first )

我猜前两个可能是等价的,但我真的不知道。

它的真正作用是什么?

【问题讨论】:

    标签: c# object static equals


    【解决方案1】:

    基本上它做了三件事:

    • 检查引用是否相等(如果是则返回 true)
    • 检查引用是否为 null(如果任一值为 null,则返回 false;至此 null == null 的情况已处理完毕)
    • 使用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 是空引用,则后者将失败
    【解决方案2】:

    默认情况下,对象等效性由对象在内存中的地址确定。如果两个实例具有相同的内存地址,则它们是相等的。

    但是,这可以在对象中重载,以便开发人员可以比较两个在同一内存位置但仍被视为相等的对象。例如,如果您有一个数据访问层,其中每个对象都有来自数据库的数据记录 ID,您可以根据 ID 比较对象相等性。

    您可以overload operators 生成此功能。

    【讨论】:

    • 您不能在 C# 中覆盖运算符。您可以重载运算符,或覆盖 Equals 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多