首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等于覆盖与IEquatable<>

等于覆盖与IEquatable<>
EN

Stack Overflow用户
提问于 2016-08-12 15:16:34
回答 1查看 2.8K关注 0票数 1

对于我来说,我无法让我的WPF绑定为RibbonComboBoxSelectedItem属性正确工作。

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

因此,我开始研究如何为我的类型显式地实现Equals。然而,这似乎有点混乱,因为至少有两个不同的版本,我可以实现。

下面的代码显示我可以重写object.Equals,也可以实现IEquatable<>。实际上,下面的代码实现了两者,测试表明两者都被调用。

代码语言:javascript
复制
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吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38921300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档