我最近遇到了这个问题,直到现在,我一直很高兴地重写了等于运算符( == )和/或 Equals 方法,以查看两个引用类型是否实际上包含相同的 数据 (即,看起来相同的两个不同的实例)。
自从我投入更多精力进行自动化测试(将参考/预期数据与返回的数据进行比较)以来,我就一直在使用此功能。
在查看MSDN中的一些编码标准指南时,我遇到了一篇建议不要这样做的文章。现在,我明白了 为什么 文章这么说了(因为它们不是同一 实例 ),但是没有回答这个问题:
非常感谢^ _ ^
似乎我误读了一些文档(这已经是漫长的一天),而覆盖Equals可能是可行的方法。
如果要实现引用类型,则如果您的类型看起来像基本类型(如Point,String,BigNumber等),则应考虑对引用类型重写Equals方法。即使大多数引用类型都 覆盖Equals ,也不应重载 equals 运算符。但是,如果要实现旨在具有值语义的引用类型(例如复数类型),则应覆盖等号运算符。
看起来您正在用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() 方法是一部分 对象 类和类重载,如果你想这种类型的功能。
对于对象而言,重载’==’可能是个坏主意的原因是,通常,您仍然希望能够进行“这些指针是否相同”比较。这些通常用于例如将元素插入到不允许重复的列表中,并且如果此操作符以非标准方式重载,则某些框架内容可能无法正常工作。