在C#中对值类型使用“等于”似乎不是一个好主意,是吗?
发布时间:2020-12-16 01:53:52 所属栏目:百科 来源:网络整理
导读:我认为值类型(结构)中“等于”的默认行为是使用反射来比较两个值的内容,因此如果性能很重要,建议覆盖Equals运算符以提高效率. 但似乎Equals的签名是: public override bool Equals( object ob ) 这意味着,即使我将覆盖此方法,当我比较值类型时,我仍然会有拳
我认为值类型(结构)中“等于”的默认行为是使用反射来比较两个值的内容,因此如果性能很重要,建议覆盖Equals运算符以提高效率.
但似乎Equals的签名是: public override bool Equals( object ob ) 这意味着,即使我将覆盖此方法,当我比较值类型时,我仍然会有拳击,因为参数必须是“对象”类型. 我对么 ?是拳击确实发生? 编辑: 解决方法
除了重写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指令(如果适用),另一个指令将被装箱(在没有更具体的重载的情况下). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |