【发布时间】:2014-12-20 20:01:58
【问题描述】:
我正在开发一个 C# 项目,我大量使用接口和 System.Collections.Immutable 库。我希望在一个不可变集合中对我的一个接口的实现进行排序,ImmutableSortedSet<IMyInterface>。
在 Java 中,这是实现Comparable<IMyInterface> 并覆盖equals 和hash 代码函数的简单问题。我在.net IComparable<IMyInterface> 中找到了一个类似的接口,但它警告实现者,如果他们选择实现该接口,那么他们还应该覆盖比较运算符(、=),以及实现@987654325 @。 IEquatable<T> 警告实现者,他们应该重写 equals 和 hash code 函数,以及 '==' 和 '!=' 运算符。
现在我正在重新考虑实现IComparable<T>,我不是在这里创建新的原始类型,我只是想为复杂的引用类型提供一种方便的排序算法。此外,在 C# 中似乎存在一定的问题,在接口级别覆盖运算符,因此我倾向于使用单独的 IComparer<IMyInterface> 实现。
真正让我大吃一惊的是:
IEquatable<T>接口由泛型集合对象使用,例如Dictionary<TKey, TValue>、List<T>和LinkedList<T>,在Contains、IndexOf、LastIndexOf和 @ 等方法中测试相等性时987654336@。应该为可能存储在通用集合中的任何对象实现它。
这是否结合
如果你实现了
IEquatable<T>,你还应该重写Object.Equals(Object)和GetHashCode的基类实现,使它们的行为与IEquatable<T>.Equals方法的行为一致。如果您确实覆盖了Object.Equals(Object),那么在调用您的类上的静态Equals(System.Object, System.Object)方法时也会调用您被覆盖的实现。此外,您应该重载 op_Equality 和 op_Inequality 运算符。这可确保所有相等性测试返回一致的结果。
意味着对于我想要存储在泛型集合中的任何类型,我都需要覆盖 '==' 和 '!=' 运算符??
【问题讨论】: