- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这样做有什么意义吗?
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:我可能一直对使用接口(interface)的情况感到困惑。显然发生了拳击。
编辑 3:如果未在值类型中覆盖 ToString()
,则确实会发生装箱。
我从 ECMA-335 第 3 部分第 25 页(只注意到最后一种情况)得到这个:
If thisType is a value type and thisType does not implement method then ptr is dereferenced, boxed, and passed as the ‘this’ pointer to the callvirt of method
This last case can only occur when method was defined on
System.Object
,System.ValueType
, orSystem.Enum
and not overridden by thisType. In this last case, the boxing causes a copy of the original object to be made, however since all methods onSystem.Object
,System.ValueType
, andSystem.Enum
do not modify the state of the object, this fact can not be detected.
编辑 4: Here is a similar question on SO .
关于c# - 拳击,已成为过去?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3499651/
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: What is boxing and unboxing and what are the trade off
这样做有什么意义吗? public static void Write(T value) { textWriter.Write(value.ToString()); } ...应该是这样的:
简而言之,我认为拳击是一种烦恼。让我们看看一些替代方案... public class Box where T : struct { public T Value { get; set
我只是想用 创建一个天气应用程序。天气 View Controller 显示 TableView 与 细胞 ,当单元格为 时轻拍导致 WeatherDetailsViewController . 我正
如有错误,请指正。Boxing+Varargs 是否优于 Boxing+Widening? 我在site中找到了那是另一种方式。 最佳答案 当多个可以符合条件时调用什么方法在 JLS #15.2.2
我正在通过 C#(第 4 版)阅读 CLR 一书,不是作为 C# 的新手,而是作为了解该语言的人试图提高我对 CLR 底层功能的掌握。 无论如何,在这本书中给出了一个例子 (pg127-131),当讨
我正在使用 Java 8 Stream API,如下所示: private Function process; // Intermediate step (& types) priv
我是一名优秀的程序员,十分优秀!