在C#中为类实现==运算符的最佳实践是什么?

时间:2009-10-06 11:12:13

标签: c# operators equals-operator

在实施==运算符时,我觉得我缺少一些基本要点 因此,我正在寻找一些最佳实践。
以下是我正在考虑的一些相关问题:

  • 如何干净地处理参考比较?
  • 是否应该通过类似IEquatable<T>的接口实现?或覆盖object.Equals
  • 那么!=运营商呢?

(此列表可能并非详尽无遗)。

4 个答案:

答案 0 :(得分:10)

我会关注微软的Guidelines for Overloading Equals() and Operator ==

编辑:微软的指南包含了这一重要评论,这似乎证实了Henk的答案:

  

默认情况下,运算符==测试引用相等性   确定两个引用是否表示相同的对象,因此引用   类型不需要实现operator ==以获得此功能   功能。当一个类型是不可变的时,意味着包含在中的数据   实例无法更改,重载operator ==进行比较   值相等而不是引用相等可能是有用的,因为,as   不可变对象,只要它们可以被认为是相同的   具有相同的价值。在非不可变类型中覆盖operator ==   不推荐

答案 1 :(得分:4)

每次实施==运算符时,请务必同时实施!=IEquatable<T>并覆盖Object.Equals()Object.GetHashCode()以确保用户的一致性你的班级。

考虑一个班级,这是我通常的实施:

    public bool Equals(MyClass other) {
        if (ReferenceEquals(other, null))
            return false;
        if (ReferenceEquals(other, this))
            return true;
        return // your equality code here
    }

    public override bool Equals(object obj) {
        return Equals(obj as MyClass);
    }

    public override int GetHashCode() {
        return // your hash function here
    }

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

    public static bool operator !=(MyClass left, MyClass right) {
        return !(left == right);
    }

答案 2 :(得分:3)

  • 如果实现==,则覆盖.Equals和。的GetHashCode
  • 实施!=以及
  • 使用object.ReferenceEquals检查空引用,否则运算符将递归

答案 3 :(得分:3)

最常见的方法是来处理它。默认值是引用比较,通常适用于类对象。

首先,您要确保您需要价值型行为。