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

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

对于像Customer这样的典型域实体,实现equals方法和相等运算符的最佳实践是什么?

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

正如JaredPar在这里提到的, Equals将实际测量值的相等性,而==将测量它们是否是相同的参考。

来自MSDN :

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

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

通常我不会为我的类(例如Customer)实现(= operator或Equals())。

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

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