C# NET堆栈和堆,当我声明一个字符串时会发生什么?
如果我执行这一行,我将创建一个作为引用的字符串C# NET堆栈和堆,当我声明一个字符串时会发生什么?,c#,.net,C#,.net,如果我执行这一行,我将创建一个作为引用的字符串 string mystring = "Hello World" 变量mystring与我声明的对象在同一上下文中吗?堆上的数据“Hello World”?是一个实现细节,您不需要知道 当然,对于特定(当前)版本的框架来说,这是众所周知的: 1) 如果这是在一个方法中,那么mystring是一个引用变量,通常在堆栈上。但是当它被捕获时,或者当方法是异步的,或者。。。它被移动到堆中 2) 如果这是在一个类中,那么每个实例将包含一个mystring引用
string mystring = "Hello World"
变量mystring
与我声明的对象在同一上下文中吗?堆上的数据“Hello World”
?是一个实现细节,您不需要知道
当然,对于特定(当前)版本的框架来说,这是众所周知的:
1) 如果这是在一个方法中,那么mystring
是一个引用变量,通常在堆栈上。但是当它被捕获时,或者当方法是异步的,或者。。。它被移动到堆中
2) 如果这是在一个类中,那么每个实例将包含一个mystring
引用作为一个字段,存储在堆中
在这两种情况下,堆上都有一个匿名字符串对象,其中包含“Hello World”,这很复杂。
首先,所有字符串都由编译器插入,因此您的字符串可以是对先前分配的字符串对象的引用。
其次,它是一个实现细节,您不必担心,它可以在下一个C#/.NET版本中更改。
我会推荐你阅读Eric Lippert的优秀文章,他是编写C#编译器的人之一:阅读这些。。。来自埃里克·利珀特。。。他写了C#编译器!我应该回答你所有的问题
如果你打算将其称为官方答案,那么推荐人应该是great@KierenJohnstone-林克死了(404)