为什么Microsoft建议跳过为引用类型实现相等运算符?

时间:2011-11-10 07:24:25

标签: c# .net reference-type

根据MSDN大多数引用类型都不能重载相等运算符,即使它们重写等于。但是,如果要实现旨在具有值语义的引用类型(例如复数类型),则必须覆盖相等运算符。

为客户等典型的域实体实施 equals 方法和平等运算符的最佳做法是什么?

如果两个实体的身份相同,是否应该实施 equals 方法返回 true ?如果实体不是不可变的怎么办?如果两个实体都是新的并且它们的身份具有空值,那该怎么办?等式运算符怎么样?

正如JaredPar提到的here 等于实际测量值的相等性,而==将衡量它们是否是相同的参考。

2 个答案:

答案 0 :(得分:5)

来自MSDN

  

大多数引用类型都不能重载相等运算符,即使它们重写等于。但是,如果要实现旨在具有值语义的引用类型(例如复数类型),则必须覆盖相等运算符。

Microsoft认为==应仅用于类似值的类型,例如数字类型,例如ComplexBigInt等。复合类型(如Person)不应覆盖相等运算符。这是代码风格的问题,Microsoft建议您遵循此指南。我怀疑编译结果会有很大不同。

答案 1 :(得分:3)

通常我不会为我的类(例如Customer)实现(=运算符或等号())。

你绝对不应该覆盖=运算符,因为使用你的类的开发人员期望比较指针而不是实例本身,改变这种行为只会导致错误,因为人们不希望它以这种方式工作。 / p>

如果你想要包含一种方法来进行语义比较,这是Equals()方法的用法,你可以覆盖它以实现相等性检查,无论以何种方式在你的代码中使用它是有意义的