一尘不染

比较引用类型的两个实例的“最佳实践”是什么?

c#

我最近遇到了这个问题,直到现在,我一直很高兴地重写了等于运算符( == )和/或 Equals 方法,以查看两个引用类型是否实际上包含相同的
数据 (即,看起来相同的两个不同的实例)。

自从我投入更多精力进行自动化测试(将参考/预期数据与返回的数据进行比较)以来,我就一直在使用此功能。

在查看MSDN中的一些编码标准指南时,我遇到了一篇建议不要这样做的文章。现在,我明白了 为什么 文章这么说了(因为它们不是同一 实例
),但是没有回答这个问题:

  1. 比较两种参考类型的最佳方法是什么?
  2. 我们应该实现IComparable吗?(我也看到提到,这应该只保留给值类型)。
  3. 有一些我不知道的界面吗?
  4. 我们应该自己滚动吗?

非常感谢^ _ ^

更新资料

似乎我误读了一些文档(这已经是漫长的一天),而覆盖Equals可能是可行的方法。

如果要实现引用类型,则如果您的类型看起来像基本类型(如Point,String,BigNumber等),则应考虑对引用类型重写Equals方法。即使大多数引用类型都
覆盖Equals ,也不应重载 equals 运算符。但是,如果要实现旨在具有值语义的引用类型(例如复数类型),则应覆盖等号运算符。



阅读 280

收藏
2020-05-19

共1个答案

一尘不染

看起来您正在用C#进行编码,如果您想使用其他指标而不是“这两个指针(因为对象句柄就是指针)来比较两个对象,则您的类应使用一种称为Equals的方法进行编码。相同的内存地址?”。

我从这里获取了一些示例代码:

class TwoDPoint : System.Object
{
    public readonly int x, y;

    public TwoDPoint(int x, int y)  //constructor
    {
        this.x = x;
        this.y = y;
    }

    public override bool Equals(System.Object obj)
    {
        // If parameter is null return false.
        if (obj == null)
        {
            return false;
        }

        // If parameter cannot be cast to Point return false.
        TwoDPoint p = obj as TwoDPoint;
        if ((System.Object)p == null)
        {
            return false;
        }

        // Return true if the fields match:
        return (x == p.x) && (y == p.y);
    }

    public bool Equals(TwoDPoint p)
    {
        // If parameter is null return false:
        if ((object)p == null)
        {
            return false;
        }

        // Return true if the fields match:
        return (x == p.x) && (y == p.y);
    }

    public override int GetHashCode()
    {
        return x ^ y;
    }
}

Java具有非常相似的机制。该 的equals() 方法是一部分 对象 类和类重载,如果你想这种类型的功能。

对于对象而言,重载’==’可能是个坏主意的原因是,通常,您仍然希望能够进行“这些指针是否相同”比较。这些通常用于例如将元素插入到不允许重复的列表中,并且如果此操作符以非标准方式重载,则某些框架内容可能无法正常工作。

2020-05-19