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

Ark*_*kun 10 .net c# jit

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

public static class MyDict<T> {
    public static T Value;
}
Run Code Online (Sandbox Code Playgroud)

我可以存储尽可能多的值,并且编译器之前不知道我要使用的类型.这些静态字段值的存储方式和位置在哪里?

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

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

Eri*_*ert 15

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

它们存储在CLR选择的位置的存储器中.

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

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

是堆吗?

好吧,它不是堆栈或寄存器,这是肯定的.

它是一些特殊的CLR内存吗?

是的.

这叫什么?

高频堆.

还有什么方式存储?

虚函数表.接口映射结构.方法说明.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)?

不,如果您需要,请自行构建.


Bri*_*all 5

MyDict<T>不是完全定义的类型.每个完全定义的类型MyDict<T>有一定的价值的自己独特的实例(例如MyDict<string>,MyDict<object>MyDict<int>可以拥有的唯一值Value).

此外,这是不是因为特殊的类型ValueT,即使类型ValueDateTime,每个完全定义类型仍然有自己的静态值的实例.