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

时间:2019-01-09 07:23:26

标签: c# static constants readonly

我已经在程序中使用了三个字段,并在用法上有所不同,但是我对将这些字段存储在何处感到困惑不大?在数据段(堆栈还是堆?)或代码段中?

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

在ILDASM中,这些字段描述如下

对于静态:.field private静态int32 a

对于常量:.field私有静态文字int32 b = int32(0x000004D3)

对于只读:.field private initonly int32 c

4 个答案:

答案 0 :(得分:3)

每个静态变量都存储在堆中,无论它是在引用类型中声明还是在值类型中声明。无论创建多少个实例,总共只有一个插槽。 (尽管并不需要为该插槽创建任何实例。)有关变量所驻留的确切堆的细节很复杂。您可以找到HERE

的更多信息

答案 1 :(得分:3)

您知道const是静态的,这意味着它存储在堆中。只读就像一个成员。与其他成员一样,readonly的值也存储在堆中。 有关const和readonly的更多参考,请参见下面的链接。 https://blogs.msdn.microsoft.com/csharpfaq/2004/12/03/what-is-the-difference-between-const-and-static-readonly/

答案 2 :(得分:1)

CLR将内存分为三个不同的区域:堆栈,堆和高频堆。静态对象需要在GC收集中幸存下来,并存储在高频堆中。静态和常量对象在应用程序的整个生命周期内存在内存中,因此它们存储在加载程序堆中。他们不需要被垃圾收集。

答案 3 :(得分:1)

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