C#关于平等实施的不同MSDN指南

C#关于平等实施的不同MSDN指南,c#,equals,equality,msdn,C#,Equals,Equality,Msdn,为什么下面的文档在实现Equals方法时讨论了不同的方法 第二个文档(是最近的)没有明确实现强类型版本的Equals(比如public bool Equals(mysupertroperclass o)) 从指南中删除强类型方法的根本原因是什么?我应该在生产代码中使用哪种方法?删除强类型版本没有任何好处。恰恰相反,正如第一页所提到的 除了实施Equals之外,还建议 (对象),任何类也为自己的类型实现Equals(type), 提高绩效 对于值类型来说,这是双重事实 我假设第二个页面根本

为什么下面的文档在实现
Equals
方法时讨论了不同的方法

第二个文档(是最近的)没有明确实现强类型版本的
Equals
(比如
public bool Equals(mysupertroperclass o)


从指南中删除强类型方法的根本原因是什么?我应该在生产代码中使用哪种方法?

删除强类型版本没有任何好处。恰恰相反,正如第一页所提到的

除了实施Equals之外,还建议 (对象),任何类也为自己的类型实现Equals(type), 提高绩效

对于值类型来说,这是双重事实


我假设第二个页面根本不关心这个问题,因为在
System.Object
上只定义了弱类型版本。强类型版本通常与实现
IEquatable
同时进行,其中提到了
Equals(T)
Equals(object)
之间的交互。您应该实现强类型Equals以提高性能。正如第一篇文章中所写的,当您想检查两个事物是否具有相同的值时,您可以使用==
如果要检查两个对象是否实际引用到同一实例,请使用Equals()

请记住,只有当Equals()为真时,==也必须为真

关于GetHashCode()-在某些情况下,包含字典之类的结构,请使用此特定方法来区分数据。由您决定如何区分数据,但在更改对象的值以使其正常工作时,不能更改GetHashCode()。这意味着它在对象生命周期内应保持相同的值

当你这样做的时候:

MyClass A = new MyClass();
MyClass B = A;
当您检查(A==B)时,您实际上检查指针A地址是否与指针B地址具有相同的值。

因此,在99.99%的通用开发中,您不需要实现Equals()。

微软决定在许多原语类型中重载
Equals
的一个不幸的副作用是,在许多情况下,即使
((Object)X)。Equals(Y)
将作为一个等价关系(它应该这样做),由于隐式转换,
X.Equals(Y)
不会。例如,
3.Equals(3.0)
将返回false,但
(3.0).Equals(3)
将返回true。虽然
=
操作符没有那么糟糕(通常如果
X==Y
Y==X
),但它仍然没有指定等价关系(例如,如果X=Int64.MaxValue,Y=X-1,Z=(双)X,那么X==Z和Y==Z,但X!=Y)


Microsoft放弃提供与
Equals(Object)
行为相同的
Equals()
重载的建议的原因可能是,虽然隐式强制转换可能使前者无法作为等价关系,但后者应作为等价关系,没有例外。

只有当强类型实现IEquatable时,才应该使用强类型。奇怪的是,这两位导游都没有提到IEquatable。。。