是否在C#中的堆中装箱了一个静态值类型字段?

feO*_*O2x 8 .net c#

出于好奇 - 请考虑以下示例:

public class A
{
    public static int Foo;
}

public class Program
{
    static void Main()
    {
        // The following variable will be allocated on the
        // stack and will directly hold 42 because it is a
        // value type.
        int foo = 42;

        // The following field resides on the (high frequency)
        // heap, but is it boxed because of being a value type?
        A.Foo = 42;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题如下:盒子的值是Foo盒装的,因为它驻留在堆上?或者它是否在一个特殊的容器对象/内存部分中封装它就像实例值类型字段是堆上对象的一部分一样?

我认为它没有盒装,但我不确定,我找不到任何文件.

谢谢您的帮助.

Han*_*ant 7

在CLR并没有有一个类的每一个领域都需要有相同的存储类型的限制.只有实例成员才会在GC堆上结束.静态成员在加载程序堆中分配.或者在字段具有[ThreadStatic]属性时在线程本地存储中.这当然强制执行一个静态成员由该类对象的每个实例共享的契约.

非常简单地实现了btw,抖动分配存储并知道字段的地址.所以任何加载和存储都直接使用变量的地址.没有额外的指针解除引用,非常有效.

所以,不,根本不需要盒子,静态int只占用4个字节.

如果您想亲眼看到这个,请使用Debug + Windows + Disassembly窗口.显示机器代码,您将直接使用变量的地址看到它.每次运行程序时都会出现不同的地址,这是一种恶意软件对策.