了解IEquatable
如果我想比较对象,他们实现了IEquatable <>接口,我有几个问题:
- 为什么我必须重写Equals(object),如果我必须实现Equals <>
- 我可以使用==和!=一旦我实现IEquatable?
关于#1:
来自MSDN:
如果实现
IEquatable<T>
,则还应该重写Object::Equals(Object)
和GetHashCode()
的基类实现,以使其行为与IEquatable<T>::Equals
方法的行为一致。 如果您重写Object::Equals(Object)
,那么您的类的静态Equals(System.Object, System.Object)
方法的调用中也会调用重写的实现。 这确保Equals()
方法的所有调用返回一致的结果。
2)不,这些做简单的参考比较,不要使用Equals方法。
1)正如Ray所说,覆盖Equals(object)
以确保一致性,当方法从不知道(静态地)知道实现IEquatable<T>
类中调用时。 例如,非generics集合类将使用Equals(object)
进行比较。 你也应该重写GetHashCode()
。
2)实现IEquatable<T>
不会自动重载==和!=运算符,但没有什么可以阻止你这样做,就像System.String
一样。 如果你这样做的话,你应该非常清楚地logging下来,并且当你在其他types的引用(比如MyType和Object)之间进行比较的时候要小心,它们仍然会使用标识符比较。 我怀疑这样做不是一个好主意,除非它会成为代码中非常常用的types,每个人都会对它非常熟悉, 并且重载的语法糖在真正会对可读性产生积极影响的地方。