静态、常量和只读字段的内存分配在哪里?

Where does the memory is allocated for static,constant and readonly fields?

我已经在程序中使用了这三个字段并了解了用法上的差异,但我有点困惑这些字段存储在哪里?在数据段(堆栈或堆?)或代码段?

static int a;
const int b=1235;
readonly int c;

在 ILDASM 中,字段描述如下

对于静态:.field private static int32 a

常量:.field private static literal int32 b = int32(0x000004D3)

只读:.field private initonly int32 c

每个静态变量都存储在堆上,无论它是在引用类型还是值类型中声明的。无论创建多少个实例,总共只有一个插槽。 (虽然不需要为那个插槽创建任何实例。)变量确切存在于哪个堆上的细节很复杂。您可以找到更多信息 HERE

如您所知,const 是静态的,这意味着它存储在堆中。 Readonly 就像一个成员。就像任何其他成员一样,readonly 的值也存储在堆中。 有关 const 和 readonly 的任何进一步参考,请参考下面的 link。 https://blogs.msdn.microsoft.com/csharpfaq/2004/12/03/what-is-the-difference-between-const-and-static-readonly/

CLR 是 .NET Framework 的基本虚拟机组件。 .NET Framework 中的 运行 时代环境 运行 提供代码并通过提供各种服务帮助简化开发过程。 CLR将内存分为三个不同的区域:栈、堆和高频堆。静态对象需要在 GC 收集中存活下来并存储在高频堆中。静态和常量对象存储在加载程序堆中,因为它们在应用程序的整个生命周期中都存在于内存中;他们不需要被垃圾收集。