gpt4 book ai didi

c# - 比较不装箱的结构是否相等

转载 作者:太空狗 更新时间:2023-10-29 20:27:02 25 4
gpt4 key购买 nike

我遇到了一个适用于结构的扩展方法 (SomeStruct)并返回值是否等于 default(SomeStruct) (调用无参数构造函数时)。

public static bool IsDefault<T> (this T value)
where T : struct
{
return (!EqualityComparer<T>.Default.Equals(value, default(T)));
}

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

假设:

  1. 以下第一个方法是非法的,因为结构不会隐式覆盖相等运算符 ==/!= .
  2. 第二个“出现”是为了避免装箱。
  3. 第三种方法应该始终将结构框起来,因为它正在调用 object.Equals(object o) .
  4. 第四个有两个重载可用(object/T)所以我假设它也会避免拳击。但是,目标结构需要实现 IEquatable<T>接口(interface),使辅助扩展方法不是很有用。

变化:

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)));
}

这个问题是关于确认上述假设以及我是否误解和/或遗漏了什么。

最佳答案

  1. The first of the following methods is illegal since structs do not implicitly override the equality operators ==/!=.

是的。

  1. The second "appears" to avoid boxing.

被调用方法的签名是EqualityComparer<T>.Equals(T,T)它使用类型 T对于参数,所以不需要装箱调用。

默认比较器的实现检查是否 TIEquatable<T>如果是,则使用使用 IEquatable<T>.Equals 的比较器否则使用比较器 Object.Equals ,所以如果结构不是 IEquatable,内部可能会应用装箱(“仅在需要时”)。

  1. The third method should always box the struct since it's calling object.Equals(object o).

是的。

  1. 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,它不需要装箱.这是您针对 T : IEquatable 的特定情况获得的有效代码来自 EqualityComparer<T>.Default .

关于c# - 比较不装箱的结构是否相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36822246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com