调用值类型的方法会导致在.NET中装箱吗?
我刚刚参与Stack Overflow问题.NET中的所有东西都是对象吗?
并且一张海报(在接受的答案的评论中)似乎认为对值类型执行方法调用导致拳击。他向我指出了Boxing和Unboxing(C#编程指南),它没有明确指出我们描述的用例。
我不是一个信任单一来源的人,所以我只是希望得到关于这个问题的进一步反馈。我的直觉是没有拳击,但我的直觉确实很糟糕。 :d
进一步阐述:
我使用的例子是:
int x = 5;
string s = x.ToString(); // Boxing??
如果有问题的结构覆盖从对象继承的方法,则不会发生拳击,如此处所接受的答案所述。
但是,如果结构不覆盖该方法,则在callvirt之前执行“约束”CIL命令。根据文档,OpCodes.Constrained Field,这导致拳击:
如果thisType是值类型和
thisType没有实现方法
然后ptr被解除引用,装箱,和
作为'this'指针传递给
callvirt方法指令。
没有找到相关结果
已邀请:
4 个回复
容淑阔九
所以这个案子的答案是否定的。
柑恫祟
然后
不会导致拳击:
但是,这样做:
悍蕾驮苇袜
主方法的MSIL(通过ILDASM)是这样的:
现在,尽管没有发生拳击呼叫,如果你查看有关受限+呼叫virt的文档,你会发现它表明拳击已经发生。 OOO 引用: 如果thisType是值类型和 thisType没有实现方法 然后ptr被解除引用,装箱,和 作为'this'指针传递给 callvirt方法指令。
曝匿弄罚