C#相等检查

C#相等检查,第1张

概述您为创建的结构和类编写等式检查的方法是什么? 1)“完全”等式检查是否需要大量样板代码(例如重写等于,覆盖GetHashCode,泛型Equals,operator ==,operator!=)? 2)您是否明确指定您的类为IEquatable< T>接口? 3)我是否正确理解,没有实际的方法来自动应用均衡覆盖,当我调用像== b这样的东西,我总是要实现Equals和operator ==成员? 您为创建的结构和类编写等式检查的方法是什么?

1)“完全”等式检查是否需要大量样板代码(例如重写等于,覆盖GetHashCode,泛型Equals,operator ==,operator!=)?

2)您是否明确指定您的类为IEquatable< T>接口?

3)我是否正确理解,没有实际的方法来自动应用均衡覆盖,当我调用像== b这样的东西,我总是要实现Equals和operator ==成员?

解决方法 你说得对,这是很多锅炉代码,你需要分开实现.

我会建议:

>如果要实现价值相等性,则覆盖GetHashCode和Equals(object) – 为==创建重载并实现IEquatable< T>没有这样做可能会导致非常意外的行为
>我将始终实施IEquatable< T>如果你重写Equals(object)和GetHashCode
>我只是更少地重载== *** 作符
>为非密封类正确实现平等是棘手的,仍然会产生令人惊讶/不良的结果.如果您需要层次结构中的类型相等,则实现IEqualityComparer< T>表达您感兴趣的比较.
>可变类型的平等通常是一个坏主意,因为两个对象可以相等,然后在以后不相等…如果一个对象在哈希表中被用作密钥之后被突变(以相等影响的方式),那么你将无法再找到它.
>一些锅炉板结构略有不同,但像marc一样,我很少写自己的结构.

这是一个示例实现:

using System;public sealed class Foo : IEquatable<Foo>{    private Readonly string name;    public string name { get { return name; } }    private Readonly int value;    public int Value { get { return value; } }    public Foo(string name,int value)    {        this.name = name;        this.value = value;    }    public overrIDe bool Equals(object other)    {        return Equals(other as Foo);    }    public overrIDe int GetHashCode()    {        int hash = 17;        hash = hash * 31 + (name == null ? 0 : name.GetHashCode());        hash = hash * 31 + value;        return hash;    }    public bool Equals(Foo other)    {        if ((object) other == null)        {            return false;        }        return name == other.name && value == other.value;    }    public static bool operator ==(Foo left,Foo right)    {        return object.Equals(left,right);    }    public static bool operator !=(Foo left,Foo right)    {        return !(left == right);    }}

是的,这是一个很多样板,很少有实现之间的变化:(

==的实现效率略低于它,因为它将调用等于需要进行动态类型检查的Equals(object),但是替代方案更像是锅炉板,如下所示:

public static bool operator ==(Foo left,Foo right){    if ((object) left == (object) right)    {        return true;    }    // "right" being null is covered in left.Equals(right)    if ((object) left == null)    {        return false;    }    return left.Equals(right);}
总结

以上是内存溢出为你收集整理的C#相等检查全部内容,希望文章能够帮你解决C#相等检查所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存