8

この行を実行すると、参照である文字列が作成されます。

string mystring = "Hello World"

変数mystringは、宣言したオブジェクトと同じコンテキストにありますか? "Hello World"ヒープ上のデータは?

4

3 に答える 3

13

公式の回答:これは実装の詳細であり、知る必要はありません。

もちろん、フレームワークの特定の(現在の)バージョンについては知っています。

1) これがメソッド内にある場合mystringは、参照変数であり、通常はスタックにあります。ただし、キャプチャされたとき、またはメソッドが非同期の場合、または...ヒープに移動されます。

2) これがクラス内にある場合、各インスタンスにはmystring参照がフィールドとして含まれ、ヒープに格納されます。

どちらの場合も、ヒープに匿名の文字列オブジェクトがあり、"Hello World"

于 2012-10-04T13:00:18.370 に答える
5

それは複雑です。まず、文字列はコンパイラによってインターンされるため、文字列は以前に割り当てられた文字列オブジェクトへの参照になる可能性があります。2 つ目は実装の詳細であり、心配する必要はなく、C#/.NET の次のバージョンで変更される可能性があります。C# コンパイラの作成者の 1 人である Eric Lippert による優れた投稿を紹介します

于 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 に答える