.Net在哪里存储泛型类型的静态字段的值?

时间:2013-12-16 14:47:14

标签: c# .net jit

以下代码允许我为每种类型T存储一个值:

public static class MyDict<T> {
    public static T Value;
}

我可以存储与类型一样多的值,编译器不知道我将要使用的类型。 这些静态字段值的存储方式和位置是什么?

更新: 显然它存储在内存中,但我想知道这个内存。是堆吗?它是一些特殊的CLR内存吗?怎么称呼?还有什么以这种方式存储?

更新2 : JITter为MyDict<__Canon>的所有引用类型参数生成单个实现MyDict<T>。然而,这些值是分开存储的。我猜每个类型参数仍然有一些per-type-argument结构,虽然thw vtable链接到JITted MyDict<__Canon>,但字段是分开的。我是对的吗?

2 个答案:

答案 0 :(得分:15)

  

存储这些静态字段值的方式和位置?

它们存储在CLR选择的位置的内存中。

  

显然它存储在内存中,但我想知道这个内存。

我出于好奇而假设。如果你根据这个问题的答案做出编程决定,那么你做错了。

  

是堆吗?

这不是堆栈或寄存器,这是肯定的。

  

是否有一些特殊的CLR内存?

是的。

  

它叫什么?

高频堆。

  

这样存储了什么?

的vtables。接口映射结构。方法说明。 CLR认为可以经常访问的任何其他内容,由CLR自行决定。我们在此深入了解实施细节。

  

JITter为MyDict<__Canon>的所有引用类型参数生成单个实现MyDict<T>

正确,尽管这是一个实现细节。

  

然而,这些值是分开存储的。

“值”是指“每个构造类型的静态字段的值”。是。

  

我猜每个类型参数

仍然有一些per-type-argument结构

是的,数据必须到达某个地方!

  

vtable链接到JITted MyDict<__Canon>,字段是分开的。

我不明白这句话是什么意思,所以我无法证实或否认其正确性。

  

我也想知道是否有办法像这样拥有每个对象的商店。即不是泛型类型+ T,而是对象+ T

为了澄清,您的问题是:有一些存储机制将泛型类型C<T>和给定构造C<Foo>与给定的静态字段C<Foo>相关联。我们可以将此视为查找,其中“键”是元组(C<T>Foofield),值是字段的值。是否存在密钥为(C<T>some arbitrary objectfield)的类似存储机制?

没有。如果需要,可以自己构建。

答案 1 :(得分:5)

MyDict<T>不是完全定义的类型。每个完全定义的MyDict<T>类型都有自己唯一的值实例(例如MyDict<string>MyDict<object>MyDict<int>可以具有唯一值Value

此外,这并不特别,因为Value的类型为T,即使Value的类型为DateTime,每个完全定义的类型仍会有它自己的静态值实例。