代码之家  ›  专栏  ›  技术社区  ›  Tigraine

c需要显式相等运算符实现

c#
  •  7
  • Tigraine  · 技术社区  · 15 年前

    我看到了为我的对象显式实现equals和gethashcode的要点。

    但是我想知道是否也显式地实现==和有意义!=这样的运算符:

    public static bool operator ==(Salutation left, Salutation right)
    {
        return Equals(left, right);
    }
    

    当调用==时,C是否不自动使用equals方法?

    2 回复  |  直到 15 年前
        1
  •  8
  •   Noldorin    15 年前

    重写相等运算符和 Equals . 事实上,这是非常明智的。

    微软已经正式发布了 Guidelines for Implementing Equals and the Equality Operator (==) 在MSDN上。我肯定会按那里的推荐做法去。这两个要点是:

    • 每当实现equals时,就实现gethashcode方法 方法。这个保持相等 GetHashCode已同步。
    • 每当实现相等运算符时重写Equals方法 (==)并让他们做同样的事情。 这允许基础结构代码 作为hashtable和arraylist,使用 equals方法,行为相同 以用户代码的方式使用 相等运算符。

    乔恩·斯基特还写了一篇 useful MSDN blog post 关于主题,总结 等于 以及 == 操作员默认使用参考/值类型。

    最重要的部分如下:

    equals方法只是一个虚拟的 在System.Object中定义的一个,以及 由选择的类重写 这样做。==运算符是一个 可被重载的运算符 类,但通常 身份行为。

    对于==没有的引用类型 它比较 两个引用引用相同 对象-这正是 等号的实现 对象。

    值类型不提供重载 默认情况下,==然而,大多数 由提供的值类型 框架提供了自己的过载。 equals的默认实现 值类型由提供 值类型,并使用反射 比较,这使得 明显慢于 类型特定的实现通常 将是。这一实施也 对引用调用等于 在比较的两个值内。

        2
  •  2
  •   Joel Coehoorn    15 年前

    如果不重载它,==只检查引用相等性:两边引用同一对象吗?

    如果需要值相等(两边的不同对象是否具有相同的值?),您可以重载运算符。此时,您几乎总是希望同时重载.equals()和.gethashcode(),只需要进行==重载调用.equals()。