.NET堆栈和堆,当我声明一个字符串时会发生什么?

如果我执行这一行,我创建一个作为参考的字符串。

string mystring = "Hello World" 

变量mystring在与我声明的对象相同的上下文中吗? 堆上的数据"Hello World"

官方答复:这是一个实施细节,你不需要知道。

它当然可以知道框架的特定(当前)版本:

1)如果这是一个方法,那么mystring是一个引用变量,通常在堆栈上。 但是当它被捕获时,或者当方法是异步的时候,或者……它被移动到堆中。

2)如果这是在一个类中,那么每个实例将包含一个mystring引用作为一个字段,存储在堆上。

在这两种情况下,堆上都有一个包含"Hello World"的匿名字符串对象

情况很复杂。 首先,字符串由编译器实现,因此您的字符串可以是对先前分配的字符串对象的引用。 其次,它是一个实现细节,您不必担心,并且可以在任何下一个C#/ .NET版本中进行更改。 我将向您推荐Eric Lippert的优秀文章,他是编写C#编译器的人之一: 这里