以下代码允许我为每种类型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>
,但字段是分开的。我是对的吗?
答案 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>
,Foo
,field
),值是字段的值。是否存在密钥为(C<T>
,some arbitrary object
,field
)的类似存储机制?
没有。如果需要,可以自己构建。
答案 1 :(得分:5)
MyDict<T>
不是完全定义的类型。每个完全定义的MyDict<T>
类型都有自己唯一的值实例(例如MyDict<string>
,MyDict<object>
和MyDict<int>
可以具有唯一值Value
)
此外,这并不特别,因为Value
的类型为T
,即使Value
的类型为DateTime
,每个完全定义的类型仍会有它自己的静态值实例。