静态成员初始化 - c#静态类型




所有静态成员都存储在哪里? (2)

这个问题在这里已有答案:

我正在尝试学习C#如何管理内存。 我坚持使用静态元素,我阅读了很多关于这个主题的博客和文章,但我找不到一个相当令人满意的答案。

让我们定义一个代码块来帮助找到答案。

class myClass
{
    static string myStr = "String Data";
    static int myInt = 12;
}

在你们分享你的答案之前,让我分享一下我对这个主题的了解。 随意同意或不同意,并帮助我找到正确的答案。

  • 静态只是一生。
  • 静态引用类型(myStr)将在堆上运行一生。
  • 静态值类型(myInt)将在堆栈中持续一生。

让我感到困惑的是,我在互联网上找到的关于这个主题的一些答案。

混乱1号:

程序启动时,会将所有相关程序集加载到AppDomain中。 加载程序集时,将调用所有静态构造函数,包括静态字段。 他们将住在那里,卸载它们的唯一方法是卸载AppDomain。

在上面的行中,明确提到存储在AppDomain上的所有静态元素。 那么为什么互联网上的每个人都说'静态'元素存储在堆/堆栈上?

困惑2:

每个静态变量都存储在堆上,无论它是在引用类型还是值类型中声明。

如果每个静态变量都存储在堆上。 那么为什么有些人说值类型静态变量存储在堆栈上?

请帮助我连接点以了解C#中静态变量的内存管理。 非常感谢你宝贵的时间:)


每当进程加载到RAM中时,我们可以说内存大致分为三个区域(在该进程中):Stack,Heap和Static(在.NET中,实际上是Heap中的一个特殊区域,仅称为高频堆)。

静态部分包含“静态”成员变量和方法。 什么是静态的? 那些不需要创建类实例的方法和变量被定义为静态的

here阅读更多。


创建了一个类的实例,初始化了所有静态成员。

静态类的成员通常存储在堆上,值类型的成员通常存储在堆栈中。

这不一定是这种情况,您可以阅读this博客以获取更多信息。

它来自C#,Eric Lippert的语言设计师之一。

博客显示,与普通知识相反,它不确定值类型是否在堆栈上,引用类型是否在堆上,但它们通常是。

它没有在规范中指定。







heap