8

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

string mystring = "Hello World"

变量是否mystring与我声明的对象在同一上下文中?"Hello World"堆上的数据呢?

4

3 回答 3

13

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

对于框架的特定(当前)版本当然是可知的:

1) 如果 this 在方法内部,mystring则为引用变量,通常在堆栈上。但是当它被捕获时,或者当方法是异步的,或者......它被移动到堆中。

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

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

于 2012-10-04T13:00:18.370 回答
5

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

于 2012-10-04T13:03:45.920 回答
4

阅读这些……来自 Eric Lippert……他编写了 C# 编译器!应该回答你所有的问题。

http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx

http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

于 2012-10-04T13:21:37.837 回答