VS2005文档重载Equals()和Operator ==(C#编程指南)的指南部分说明
不建议在非不可变类型中覆盖operator ==.
较新的.NET Framework 4文档实现等于和等于运算符的指南(==)省略了该语句,尽管社区内容中的一篇帖子重复了断言并引用了旧文档.
似乎至少对于一些琐碎的可变类来重写Equals()是合理的,例如
public class ImaginaryNumber
{
public double RealPart { get; set; }
public double ImaginaryPart { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在数学中,具有相同实部和相同虚部的两个虚数实际上在测试相等性的时间点是相等的.声明它们不相等是不正确的,如果具有相同RealPart和ImaginaryPart的单独对象未被覆盖Equals(),则会发生这种情况.
另一方面,如果一个重写Equals(),则还应该重写GetHashCode().如果将覆盖Equals()和GetHashCode()的ImaginaryNumber放在HashSet中,并且可变实例更改其值,则不再在HashSet中找到该对象.
MSDN是否不正确删除有关不覆盖Equals()和operator==非不可变类型的指南?
为可变类型重写Equals()是否合理,其中"在现实世界中"所有属性的等价意味着对象本身是相等的(如同ImaginaryNumber)?
如果它是合理的,当对象实例参与HashSet或依赖于GetHashCode()的其他东西没有改变时,如何最好地处理潜在的可变性?
UPDATE
通常,当期望将类型的对象添加到某种类型的集合时,或者当它们的主要目的是存储一组字段或属性时,实现值相等.您可以根据类型中所有字段和属性的比较来定义值相等,或者可以将定义基于子集.但无论是哪种情况,还是在类和结构中,您的实现都应遵循等效的五个保证: