这样做有什么意义吗?
public static void Write<T>(T value)
{
textWriter.Write(value.ToString());
}
...据此:
public static void Write(object value)
{
textWriter.Write(value.ToString());
}
抛开明显的null取消引用的可能性,如果我在哪里使用此方法编写很多值类型,前者并不会更好,因为它将拥有它自己的write方法版本,或者只是膨胀了关于生成大量其他代码的二进制?
这种事情的性能影响可以忽略不计,但是我很好奇,它比为BCL中的每个值类型提供重载要紧凑得多,就像BCL中的大多数编写器已经做到的那样。
最佳答案
据我了解,在两种情况下都发生拳击。
后者是显而易见的,因为该值已经装箱了。
前者不太明显,但是由于在值类型上调用了虚拟方法,因此需要将其装箱以执行callvirt
。
编辑:我刚刚检查了发出的IL,并且在一般情况下没有发生显式装箱。东西虽然响了。
编辑2:我可能已经使用界面将自己与案件混淆了。显然有拳击发生。
编辑3:如果未在值类型中覆盖ToString()
,则确实发生装箱。
我是从ECMA-335第3部分第25页(仅注意最后一种情况)得到的:
编辑4: Here is a similar question on SO。
关于c# - 拳击,已成为过去?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3499651/