繁体   English   中英

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

[英]What are the best practices for implementing the == operator for a class in C#?

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

  • 如何干净地处理参考比较?
  • 它应该通过IEquatable<T>类接口实现吗? 或者重写object.Equals
  • 那么!=运算符呢?

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

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

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

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

每次实现==运算符时,一定要实现!=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);
    }
  • 如果你实现==,覆盖.Equals和。 GetHashCode的
  • 实施!=同样
  • 使用object.ReferenceEquals检查空引用,否则运算符将递归

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

所以首先你要确定你需要价值型行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM