内部值类型如何避免框

本文关键字:何避免 类型 内部 | 更新日期: 2023-09-27 17:54:00

这是关于Value Type框的问题。(Int32)


当我检查IL代码时,我发现IL调用Int32.ToString(),

和那些嵌套在Int32.ToString()下的方法没有框操作,

如我们所知,如果值类型转换为引用类型,有一个方框,

和c#没有给我们另一种方法来处理这种转换。


值类型如何转换为引用类(字符串)?

内部值类型如何避免框

当调用值类型上的实例方法时,只要可能它使用静态调用或"约束"调用;除非该类型不实现所需的方法(需要object实现),否则不需要box。为什么它需要一个盒子?它只是:不创建一个,因为它不需要一个。

注意:这就是为什么你应该总是在创建值类型时重写所有的方法;如果你不覆盖ToString()(例如),那么它需要创建一个框来调用虚拟基方法,但是如果你覆盖它,编译器可以只是静态调用覆盖,安全的知识,实例永远不会是null,方法永远不会被子类型覆盖。

作为旁注:编译器可以选择在所有情况下对值类型发出"约束"调用,这实际上是将句柄传递给JIT说:

  • 如果目标是引用类型,取消引用并使用virtual-call
  • 否则,如果目标是实现该方法的值类型,则使用static-call
  • ,否则,取消引用,框,并使用虚拟调用

然而,对于内置类型(int等),更常见的是通过静态调用直接转到方法。将"约束"方法作为默认方法的原因是,即使有人更改了声明类型的库(添加或删除实现),也可以安全使用。