c# – 比较没有装箱的相等结构

c# – 比较没有装箱的相等结构,第1张

概述我遇到了一个适用于结构(SomeStruct)的扩展方法,并返回该值是否等于默认值(SomeStruct)(当调用无参数构造函数时). public static bool IsDefault<T> (this T value) where T : struct{ return (!EqualityComparer<T>.Default.Equals(value, default 我遇到了一个适用于结构(SomeStruct)的扩展方法,并返回该值是否等于默认值(SomeStruct)(当调用无参数构造函数时).
public static bool IsDefault<T> (this T value)    where T : struct{    return (!EqualityComparer<T>.Default.Equals(value,default(T)));}

这让我想知道结构是否被装箱.这纯粹是出于好奇,因为根据上下文有拳击/传递值的优点/缺点.

假设:

>以下第一种方法是非法的,因为结构不会隐式覆盖相等运算符== /!=.
>第二个“出现”以避免拳击.
>第三种方法应该总是封装结构,因为它调用了object.Equals(object o).
>第四个有两个可用的重载(对象/ T)所以我假设它也会避免装箱.但是,目标结构需要实现IEquatable< 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)));}

这个问题是关于确认上述假设,以及我是否存在误解和/或遗漏某些问题.

解决方法
The first of the following methods is illegal since structs do not implicitly overrIDe the equality operators ==/!=.

真正.

The second “appears” to avoID Boxing.

被调用方法的签名是EqualityComparer< T> .Equals(T,T),它使用类型T作为参数,因此它不需要装箱来调用.

默认比较器的实现检查T是否是IEquatable< T>.如果是这样,那么使用一个使用IEquatable< T> .Equals的比较器,否则使用Object.Equals的比较器,所以如果结构不是IEquatable(‘仅在需要时’),内部可能会应用装箱.

The third method should always Box the struct since it’s calling object.Equals(object o).

真正.

The fourth has both overloads available (object/T) so I’m assuming it will avoID Boxing as well. However,the target struct would need to implement the IEquatable interface,making the helper extension method not very helpful.

是的,根据this SO answer,它不需要装箱.这是您从EqualityComparer< T> .Default获得T:IEquatable的特定情况的有效代码.

总结

以上是内存溢出为你收集整理的c# – 比较没有装箱的相等结构全部内容,希望文章能够帮你解决c# – 比较没有装箱的相等结构所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存