对于我来说,我无法让我的WPF绑定为RibbonComboBox的SelectedItem属性正确工作。
然后,我开始阅读关于.NET如何比较项的文章。我的理解是,在某些情况下,它会比较实际的指针。例如,在这种情况下,从数据库加载一个新的等值时,它可能被认为是不相等的。
因此,我开始研究如何为我的类型显式地实现Equals。然而,这似乎有点混乱,因为至少有两个不同的版本,我可以实现。
下面的代码显示我可以重写object.Equals,也可以实现IEquatable<>。实际上,下面的代码实现了两者,测试表明两者都被调用。
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;
}
}有人能帮助我理解,根据具有相同值的指针,避免用.NET库例程比较对象的等价性所需的是什么吗?真的有必要实现两个版本的Equals吗?
发布于 2016-08-12 15:36:20
正如msdn所指出的,如果您正在实现IEquatable<T>,则仍然需要重写Equals,因为它仍将使用签名Equals(System.Object, System.Object)调用,而yhe重写应该与从IEquatable<T>实现的方法一致。
同样,在Arno在注释中显示的关于iequatable与刚刚重写的对象等于之间的区别的问题中,当需要对集合进行优化操作时,使用IEquatable<T>,不再需要装箱,而是使用特定类型调用直接相等。
你有两个选择:
如果您在程序中处理集合时对性能感兴趣,则可以继续实现这两个Equals方法;
或
您只需删除IEquatable<T>,只需重写Equals以简化代码。
此外,每当您重写Equals时,也应该始终重写GetHashCode。
https://stackoverflow.com/questions/38921300
复制相似问题