我想了解C#如何管理内存。我被困在静态元素上,我阅读了许多关于这个主题的博客和文章,但是我找不到一个相当令人满意的答案。所有静态成员存储在哪里?
让我们定义一个代码块来帮助找到答案。
class myClass
{
static string myStr = "String Data";
static int myInt = 12;
}
在你们分享你的答案之前,让我分享一下我对这个问题的了解。随意同意或不同意,并帮助我找到正确的答案。
- 静态只是终身。
- 静态引用类型(myStr)将在堆上生命期。
- 静态值类型(myInt)将在堆栈中一直存在。
什么使我困惑,是我在互联网上找到的关于这个问题的一些答案。
混乱数1:
当你的程序启动时,它加载所有相关组件到一个AppDomain。加载程序集时,将调用所有静态构造函数,包括静态字段。他们将住在那里,并且卸载它们的唯一方法是卸载AppDomain。
在上面几行中,明确指出存储在AppDomain上的所有静态元素。那么为什么互联网上的每个人都说'静态'元素存储在堆/栈上?
混淆数2:
每个静态变量被存储在堆上,无论它是否是一个参考类型或值类型中声明。
如果每个静态变量存储在堆上。那么为什么有些人说,值类型的静态变量存储在堆栈中?
请帮助连接我的点,以了解C#中静态变量的内存管理。非常感谢您宝贵的时间:)
人们首先通过拖拽“堆栈”和“堆”的概念,从而大大地混淆了自己。如果你想知道的只是对象的生命周期或声明的范围,这些概念对于它们本身并不有用,它们是C#中更相关的概念。垃圾收集意味着,95%的时间,你需要关心的是一个对象是否存在,并且只要该类被加载,一个由'static'字段引用的对象就存在。 (至于何时实例化,这是一个更复杂的话题。)当然,这不是一个答案。 –
因为他们错了。他们知道值类型_local_变量存储在堆栈中(事实上,所有局部变量都存储在堆栈中,混淆的是,对于引用类型,变量是引用而不是对象)。静态变量就像'Type'对象的成员,而'Type'不是值类型。 (当然,Java不同,C#实际上并没有一个'型'型,以使其更清晰,每一个'Type'是_different_类型,有不同的成员) –
Random832
@ Random832:并不是所有的局部变量是在栈上。关闭本地人不在堆栈上。迭代器块中的本地数据不在堆栈中。异步方法中的本地数据不在堆栈中。注册的当地人不在堆叠上。受到援助的当地人不在筹码上。不要相信当地人会走上前去;这只是错误的。当地人称为当地居民*,因为他们的名字有本地范围*,不是因为他们存储在堆栈中。 –