【发布时间】:2011-04-01 08:16:29
【问题描述】:
考虑这个微不足道的函数:
public static bool IsPositive(IComparable<int> value)
{
return value.CompareTo(0) > 0;
}
现在,如果我将 int 传递给此方法,它会被装箱。因此,将上述方法定义如下不是更好吗?
public static bool IsPositive<T>(T value) where T : IComparable<int>
{
return value.CompareTo(0) > 0;
}
以这种方式使用通用约束,我可以实现与上面的代码完全相同的功能,另外还有一个好处是不需要装箱(因为对IsPositive<int> 的调用接受int 类型的参数)。
上面的示例代码显然毫无意义。但我更广泛的问题是:总是以后一种方式定义方法(使用通用约束而不是具有某种接口类型的参数)是否有意义,以避免潜在的值类型的装箱?
我怀疑答案很可能是“是的,但它需要更多的输入,并且在许多情况下遇到值类型的可能性很小,例如当一个方法接受一些 IEnumerable<T> 时。”但我想知道这些方法之间是否存在更大的差异,这让我现在无法理解。
【问题讨论】:
-
装箱/专业化不只是关于通用类型而不是函数吗?
-
@Dario:我不确定你在问什么。如果将值类型传递给接受接口类型参数的方法,则该值将被装箱。这就是为什么可以在方法中将本地参数设置为
null的原因。另一方面,使用通用方法,IsPositive<T>中的本地参数是T类型,它可以是值类型 或 引用类型。这有意义吗? -
@Dan - 在一般情况下,值类型仍然需要装箱。 IL 允许通过
constrained指令以统一的方式使用类型,但是当编译为机器代码时,它与以前的装箱方法没有什么不同 - 没有任何好处。 -
@Mark H:如果你说的是真的,那么这显然是最令人信服的理由。不过,你确定吗?你能证明这一点吗?
-
也许不会,我会对两者进行基准测试:/
标签: .net generics interface constraints boxing