Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET堆栈和堆,当我声明一个字符串时会发生什么?_C#_.net - Fatal编程技术网

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)