gpt4 book ai didi

c# - 拳击,已成为过去?

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

这样做有什么意义吗?

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, or System.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 on System.Object, System.ValueType, and System.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/

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