对于我的生活,我无法让我的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;
}
}
的两个版本?
答案 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
。