我已经在程序中使用了三个字段,并在用法上有所不同,但是我对将这些字段存储在何处感到困惑不大?在数据段(堆栈还是堆?)或代码段中?
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
答案 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收集中幸存下来,并存储在高频堆中。静态和常量对象在应用程序的整个生命周期内存在内存中,因此它们存储在加载程序堆中。他们不需要被垃圾收集。