等于覆盖与IEquatable<>

时间:2016-08-12 15:16:35

标签: c# wpf equals iequatable

对于我的生活,我无法让我的WPF绑定对RibbonComboBox的{​​{1}}属性正常工作。

然后我开始阅读.NET如何比较项目。我的理解是,在某些情况下,它会比较实际指针。在这种情况下,例如,从数据库加载新的和相等的值可能不会被认为是相等的。

然后我开始考虑为我的类型明确实现SelectedItem。但是,这似乎有点令人困惑,因为我可以实现至少两个不同的版本。

以下代码显示我可以覆盖Equals,或者我可以实施object.Equals。实际上,下面的代码实现了两者,而测试表明都被称为

IEquatable<>

根据具有相同值的指针,有人可以帮助我理解为避免我的对象被.NET库例程进行等效比较需要什么吗?是否真的有必要实现public class TextValuePair : IEquatable<TextValuePair> { public string Text { get; set; } public int Value { get; set; } public override bool Equals(object obj) { if (obj == null || !(obj is TextValuePair)) return false; return Value == (obj as TextValuePair).Value; } public override int GetHashCode() { return Value; } public bool Equals(TextValuePair obj) { Debug.Assert(obj != null); if (obj == null) return false; return Value == obj.Value; } } 的两个版本?

1 个答案:

答案 0 :(得分:2)

正如msdn指出的那样,如果您要实施IEquatable<T>,您仍需要覆盖Equals,因为仍然会使用签名Equals(System.Object, System.Object)调用它,并且覆盖应该覆盖与IEquatable<T>实施的方法保持一致。

与Arno在评论中显示的question about the difference between iequatable and just overriding object equals一样,IEquatable<T>用于需要对集合进行操作以优化它们时,不再需要装箱,而是调用直接等于特定类型。

您有两种选择:

如果您在程序中使用集合时对性能感兴趣,则可以继续实施两种Equals方法;

您可以删除IEquatable<T>并仅覆盖Equals以简化代码。

此外,无论何时覆盖Equals,您还应始终覆盖GetHashCode