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链接到JITtedMyDict
,但字段是分开的。我说得对吗
这些静态字段值如何存储以及存储在何处
它们存储在内存中CLR选择的位置
很明显,它存储在内存中,但我想知道关于这个内存
我猜想是出于好奇。如果您根据这个问题的答案做出编程决策,那么您就做错了
是堆吗
当然,这不是堆栈或寄存器
它是某种特殊的CLR内存吗
是的
它叫什么
高频堆
以这种方式存储的还有什么
vtables。接口映射结构。方法描述。以及CLR认为将由CLR自行决定频繁访问的任何其他内容。我们在这里深入了解实施细节
JITter为MyDict
的所有引用类型参数生成一个实现MyDict
正确,但这是一个实现细节
然而,这些值是单独存储的
“值”是指“每个构造类型的静态字段的值”。对
我猜对于每个类型的参数,仍然有一些每类型的参数结构
是的,数据必须去某个地方
vtable链接到JITtedMyDict
,字段是分开的
我不明白这句话的意思,所以我无法证实或否认它的正确性
我还想知道是否有一种方法可以像这样存储每个对象。即不是泛型+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 kunobject+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