【发布时间】:2016-12-19 15:57:18
【问题描述】:
在我的一生中,我无法让我的 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的两个版本吗?
【问题讨论】:
-
它们是实现
Equals的许多可能方式,但您为什么不直接选择override Equals,因为它将始终使用。它不适用于您的情况吗? -
是的,等式的东西在 .NET 中有点乱,并不是所有的库都以相同的方式调用
Equals方法。为了进一步帮助您,您需要发布有关代码绑定部分的更多信息,以查看涉及哪些库调用。此外,为了完整起见,我将仅提及基于可变属性的哈希码是危险的。希望这与您的问题无关。 -
您可以将第一个
Equals()实现为:public override bool Equals(object obj) { return Equals(obj as TextValuePair); },只要您正在实现IEquatable<TextValuePair>。 -
如果你不实现
IEquatable<T>,Equals(object)的覆盖总是会被调用。IEquatable<T>是首选,因为它更精确且性能更好。
标签: c# wpf equals iequatable