【问题标题】:What are the best practices for implementing the == operator for a class in C#?在 C# 中为类实现 == 运算符的最佳实践是什么?
【发布时间】:2009-10-06 11:12:12
【问题描述】:

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

  • 如何干净利落地处理参考比较?
  • 应该通过类似IEquatable<T>的接口来实现吗?还是覆盖object.Equals?
  • 那么!= 运算符呢?

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

【问题讨论】:

标签: c# operators equals-operator


【解决方案1】:

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

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

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

【讨论】:

  • 链接在 2018 年失效。(这就是为什么我们应该在链接之外引用文档的相关部分。)
  • @rianjs 不正是我所做的吗?
  • "实现== 运算符的最佳实践是什么?"紧随其后的是“我会遵循微软的指导方针”引用曾经毫无疑问是一整页的单行(“避免在可变类型中执行”)不是一个特别好的答案,不。它不完整;对于想要了解有关实施 == 运算符的完整最佳实践的人来说,这只是一个想法。
  • 引文已扩展至其出处的完整段落。
【解决方案2】:

每次实现 == 运算符时,请务必同时实现 !=、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);
    }

【讨论】:

  • 这个。同样,如果您最初实现
【解决方案3】:
  • 如果您实现 ==,请覆盖 .Equals 和 .获取哈希码
  • 同时实现 !=
  • 使用 object.ReferenceEquals 检查空引用,否则运算符将递归

【讨论】:

  • 实际上,你也必须实现 !=,否则 C# 不会让你编译。
【解决方案4】:

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

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

【讨论】:

  • 让问题有明确的答案,而不是告诉别人改变他们做事方式的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多