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

Sim*_*röm 7 .net c#

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

string mystring = "Hello World"
Run Code Online (Sandbox Code Playgroud)

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

Hen*_*man 13

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

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

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

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

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


RA.*_*RA. 5

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


DRo*_*rtE 5

阅读这些......来自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

  • 两个链接均未激活 (2认同)