在C#中分配给堆或堆栈的静态变量?

时间:2017-04-30 11:49:05

标签: c# memory-management struct

有两种类型:

首先是存储在堆栈上的值类型,第二个是存储在堆上的引用类型。

现在,如果我们有一个静态变量,那么就说:

static int a= 10;
static string str = "Question";

如何完成内存分配?

如果我们有一个结构:

Struct struct
{
    int i;
    static string name;
    float f;
};

如何为此结构分配内存?

2 个答案:

答案 0 :(得分:1)

  

首先是存储在堆栈上的值类型,第二个是存储在堆上的引用类型。

这是一个经常重复的陈述,但它不是真的。如何存储变量是一个“实现细节”。

语言规范不能完全避免引用类型的实例存储在堆上的事实,但对于局部变量,无论是值类型还是对实例的引用,故事都不是那么简单。

 class A { int b; }  // int b is of a value-type but will always live on the Heap

 void M() { int a, b; ... x => a+1; ... }  // a stored different from b

并未真正指定static字段的存储方式。它也与C#程序员无关。

实际上它们存储在静态段中,该段既不是堆栈也不是堆。但我认为它们实际上是作为Type的一部分分配给Heap。可能在运行时间之间变化的实现细节。

答案 1 :(得分:0)

静态与内存分配无关,静态只意味着可以在不创建实例的情况下访问该字段。

string是一个引用类型,因此它在堆上分配,无论它是静态字段还是非静态字段。