7

在实现==运算符时,我感觉我遗漏了一些要点。
因此,我正在寻找一些最佳实践。
以下是我正在考虑的一些相关问题:

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

(此列表可能并不详尽)。

4

4 回答 4

10

我会遵循 Microsoft 的重载 Equals() 和 Operator == 指南

编辑:微软的指导方针包含这个重要的评论,这似乎证实了亨克的回答:

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

于 2009-10-06T11:18:28.430 回答
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);
    }
于 2009-10-06T11:20:17.287 回答
4
  • 如果您实现 ==,请覆盖 .Equals 和 . 获取哈希码
  • 执行 != 以及
  • 使用 object.ReferenceEquals 检查空引用,否则运算符将递归
于 2009-10-06T11:19:45.370 回答
3

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

所以首先你要非常确定你需要价值类型的行为。

于 2009-10-06T11:20:21.717 回答