如果我执行此行,我会创建一个作为参考的字符串。
string mystring = "Hello World"
变量mystring
与我声明的对象在同一个上下文中吗?堆上的数据"Hello World"
?
答案 0 :(得分:13)
Official Answer:这是一个实现细节,您不需要知道。
当然,对于框架的特定(当前)版本是可知的:
1)如果这是在方法内,那么mystring
是一个引用变量,通常在堆栈上。但是当它被捕获时,或者当方法是异步的时候,或者......它被移动到堆中。
2)如果这是在一个类中,那么每个实例将包含一个mystring
引用作为字段,存储在堆中。
在这两种情况下,堆上都有一个包含"Hello World"
答案 1 :(得分:5)
这很复杂。 首先,编译器会对字符串进行实现,因此您的字符串可以是对先前分配的字符串对象的引用。 其次,它是一个实现细节,您不必担心,并且可以在任何下一个C#/ .NET版本中进行更改。 我将向您推荐Eric Lippert的优秀文章,他是编写C#编译器的人之一:here
答案 2 :(得分: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