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

C# Net在哪里存储泛型类型的静态字段的值?,c#,.net,jit,C#,.net,Jit,以下代码允许我为每种类型存储一个值T: public static class MyDict<T> { public static T Value; } 公共静态类MyDict{ 公共静态T值; } 我可以存储任何类型的值,而编译器在开始使用什么类型之前都不知道。 这些静态字段值如何存储以及存储在何处 更新: 很明显,它存储在内存中,但我想知道关于这个内存。是堆吗?它是某种特殊的CLR内存吗?它叫什么名字?以这种方式存储的还有什么 更新2: JITter为MyDict的所

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

public static class MyDict<T> {
    public static T Value;
}
公共静态类MyDict{
公共静态T值;
}
我可以存储任何类型的值,而编译器在开始使用什么类型之前都不知道。 这些静态字段值如何存储以及存储在何处

更新: 很明显,它存储在内存中,但我想知道关于这个内存。是堆吗?它是某种特殊的CLR内存吗?它叫什么名字?以这种方式存储的还有什么

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

这些静态字段值如何存储以及存储在何处

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

很明显,它存储在内存中,但我想知道关于这个内存

我猜想是出于好奇。如果您根据这个问题的答案做出编程决策,那么您就做错了

是堆吗

当然,这不是堆栈或寄存器

它是某种特殊的CLR内存吗

是的

它叫什么

高频堆

以这种方式存储的还有什么

vtables。接口映射结构。方法描述。以及CLR认为将由CLR自行决定频繁访问的任何其他内容。我们在这里深入了解实施细节

JITter为
MyDict
的所有引用类型参数生成一个实现
MyDict

正确,但这是一个实现细节

然而,这些值是单独存储的

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

我猜对于每个类型的参数,仍然有一些每类型的参数结构

是的,数据必须去某个地方

vtable链接到JITted
MyDict
,字段是分开的

我不明白这句话的意思,所以我无法证实或否认它的正确性

我还想知道是否有一种方法可以像这样存储每个对象。即不是泛型+T,而是对象+T

为了澄清,您的问题是:有一些存储机制将泛型类型
C
和给定的结构
C
与给定的静态字段
C
相关联。我们可以将此视为一种查找,其中“键”是元组(
C
Foo
field
),值是字段的值。在密钥为(
C
某个任意对象
字段
)的情况下,是否存在类似的存储机制

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

MyDict
不是完全定义的类型。每种完全定义的
MyDict
类型都有其唯一的值实例(例如
MyDict
MyDict
MyDict
可以具有唯一的值
Value


另外,这也不是特别的,因为
值的类型是
t
,即使
值的类型是
日期时间
,每个完全定义的类型仍然会有自己的静态值实例。

真正的答案是,“编译器想在哪里存储它们,如果你不喜欢,你打算怎么做?”你是什么意思?在哪里,“RAM”不是你想要的答案吗?
MyDict
不是一个完全定义的类型。每个完全定义的
MyDict
类型都有自己独特的
Value
(例如,
MyDict
MyDict
MyDict
可以具有唯一的值
value
)。我没有将此作为答案,因为我觉得这不是您真正要问的问题,但我认为它仍然有用。@BrianBall我认为这是一个问题,我不知道答案,但我确实觉得这个问题很有趣。请不要关闭。特别有趣的是,jitted代码与所有构造类型共享引用类型作为参数。如果您想查看CLR是如何实现的,您可以查看。是的,它显然存储在内存中,但可能内存有一些名称。我还想知道是否有一种方法可以像这样存储每个对象。即不是
generic type+T
,而是
object+T
@Ark kun
object+T
版本n(实际上它只是
object
version,
T
不重要)只是非静态实例变量。@ScottChamberlain没有。正如您所说,实例字段只是“对象索引”。泛型类型的静态字段是“type+type”-索引的(
Type1.Value
不同于
Type1.Value
Type2.Value
)。我在评论中要求的是一个“对象+类型”的值"-索引。就像
字典的实例一样,但是编译时。@Ark kun:我已经回答了您的后续问题。是的,正如我写的,实例是不同的。但是我想知道值存储在哪里。非泛型类型的静态字段是singleton。实例字段是每个实例。但是泛型类型的静态字段是每个类型argu注意:这样看:
Dict
不是一个类型(不是100%准确,但为了论证起见,假设它是真的),它是一个分部。
Dict
是一个类型,
Dict
是一个类型。您不妨将它们称为
DictString
DictFoo
。泛型提供的是一种定义分部类型和使用占位符的方法(例如
T
)作为空白。运行时会为您填补这些空白,以节省大量副本/pa