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

rem*_*mio 6 c# operators equals-operator

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

  • 如何干净地处理参考比较?
  • 它应该通过类似IEquatable<T>接口实现吗?还是压倒一切 object.Equals
  • !=运营商怎么样?

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

Wim*_*nen 10

我会遵循Microsoft的重载等于()和运算符==指南.

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

默认情况下,operator ==通过确定两个引用是否指示相同的对象来测试引用相等性,因此引用类型不需要实现operator ==以获得此功能.当一个类型是不可变的,意味着实例中包含的数据不能被改变时,重载operator ==来比较值的相等而不是引用相等可能是有用的,因为作为不可变对象,只要它们具有它们,它们就可以被认为是相同的相同的价值.不建议在非不可变类型中覆盖operator ==

  • 引用被扩展到它的原始段落。 (2认同)

Jul*_*ain 5

每次实现==运算符时,请务必同时实现!=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);
    }
Run Code Online (Sandbox Code Playgroud)