c# – 比较没有装箱的相等结构
我遇到了一个适用于结构(SomeStruct)的扩展方法,并返回该值是否等于默认值(SomeStruct)(当调用无参数构造函数时).
public static bool IsDefault<T> (this T value) where T : struct { return (!EqualityComparer<T>.Default.Equals(value,default(T))); } 这让我想知道结构是否被装箱.这纯粹是出于好奇,因为根据上下文有拳击/传递值的优点/缺点. 假设: >以下第一种方法是非法的,因为结构不会隐式覆盖相等运算符== /!=. 变化: public static bool IsDefault<T> (this T value) where T : struct { // Illegal since there is no way to know whether T implements the ==/!= operators. return (value == default(T)); } public static bool IsDefault<T> (this T value) where T : struct { return (!EqualityComparer<T>.Default.Equals(value,default(T))); } public static bool IsDefault<T> (this T value) where T : struct { return (value.Equals(default(T))); } public static bool IsDefault<T> (this T value) where T : struct,IEquatable<T> { return (value.Equals(default(T))); } 这个问题是关于确认上述假设,以及我是否存在误解和/或遗漏某些问题. 解决方法
真正.
被调用方法的签名是EqualityComparer< T> .Equals(T,T),它使用类型T作为参数,因此它不需要装箱来调用. 默认比较器的实现检查T是否是IEquatable< T>.如果是这样,那么使用一个使用IEquatable< T> .Equals的比较器,否则使用Object.Equals的比较器,所以如果结构不是IEquatable(‘仅在需要时’),内部可能会应用装箱.
真正.
是的,根据this SO answer,它不需要装箱.这是您从EqualityComparer< T> .Default获得T:IEquatable的特定情况的有效代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |