加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C#中对值类型使用“等于”似乎不是一个好主意,是吗?

发布时间:2020-12-16 01:53:52 所属栏目:百科 来源:网络整理
导读:我认为值类型(结构)中“等于”的默认行为是使用反射来比较两个值的内容,因此如果性能很重要,建议覆盖Equals运算符以提高效率. 但似乎Equals的签名是: public override bool Equals( object ob ) 这意味着,即使我将覆盖此方法,当我比较值类型时,我仍然会有拳
我认为值类型(结构)中“等于”的默认行为是使用反射来比较两个值的内容,因此如果性能很重要,建议覆盖Equals运算符以提高效率.

但似乎Equals的签名是:

public override bool Equals( object ob )

这意味着,即使我将覆盖此方法,当我比较值类型时,我仍然会有拳击,因为参数必须是“对象”类型.

我对么 ?是拳击确实发生?
我应该只使用==运算符作为值类型吗?

编辑:
还有一个小问题,为什么当我覆盖==它应该是静态的并获得2个参数而不是更直观的不静态形式并将“this”与一个参数进行比较?

解决方法

除了重写Object.Equals()之外,您还应该实现IEquatable< T>,其中T是您自己的类型. IEquatable< T> .Equals()接受类型为T的参数.

如果你隐式地实现了接口(为什么不呢?)那么在可能的情况下将使用接受T型参数的更具体的方法,并且在这种情况下不会发生装箱. (如果你重载Equals()并且没有实现接口,这是正确的,但在这种情况下没有理由不实现接口.)

这是我在实现值类型相等时通常使用的模式:

struct Foo : IEquatable<Foo>
{
    public bool Equals(Foo other)
    {
        // Do your equality test here.
        throw new NotImplementedException();
    }

    public override bool Equals(object other)
    {
        if (other != null && other is Foo) {
            return Equals((Foo)other);
        }

        return false;
    }

    // If you also want to overload the equality operator:
    public static bool operator==(Foo a,Foo b)
    {
        return a.Equals(b);
    }

    public static bool operator!=(Foo a,Foo b)
    {
        return !a.Equals(b);
    }
}

当然,不要忘记重写Object.GetHashCode().

请注意,使用Equals(object)方法时,只会对参数进行装箱.您要调用的对象不会被装箱,除非您首先将其转换为对象(或接口类型).将为您调用的对象发出一个ldloca,ldflda或ldsflda指令(如果适用),另一个指令将被装箱(在没有更具体的重载的情况下).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读