2016-07-21 2 views
4
string first="Example"; 
string second="Example"; 

両方の文字列が同じハッシュコードを持ち、両方の参照が同じです。同じ値の2つの文字列がどのようにメモリに格納されていますか?

私の質問です:これらの文字列変数は、メモリロケーションに1つのデータコピーを持っていますか?

string third="Example"; 
static string fourth="Example"; 
const string fifth="Example"; 

上記の2つのセットに違いはありますか?この具体例

+1

この場合、リテラル文字列は[文字列プール]に追加されるため、すべての変数は同じ文字列オブジェクトを参照します(https://msdn.microsoft.com/en-us/library/system.string.intern(v = vs .110).aspx) –

+1

Timに加えて、新しい文字列( "Example")を使うときは、新しいインスタンスへの新しい参照を作成します。 – HimBromBeere

答えて

4

、すべての文字列は、単一のstringオブジェクトに同じ値と異なる参照、です。これは、ldstr IL命令がリテラル文字列をインターンし、ldstrに割り当てるのではなく、それらを再利用するためです。

あなたはそれがその後、呼び出しサイトでリテラルldstrになって、そしてどのようにインターンが共有されている依存することができますので、const 1が多少のinterstingであることなどReferenceEquals(first, second)

注これを確認することができますアセンブリの境界上にある。

しかし、すべて"Example"は同じ参照である必要があります。文字列を取得する他のほとんどのメカニズム(入力データの処理から)は、ではありません。は、内部データを調べますが、新しい文字列を作成します。

+0

指摘してくれてありがとう!私はこのトピックを読む必要があります^^ –

+0

あなたの答えに感謝しますが、私はあなたに尋ねるもう一つの事があります。 'code StringBuilder test =新しいStringBuilder(" abcde "); 文字列test2 = "abcde"; string test3 = String.Intern(test.ToString()); ' 上記のスニペットにはそれぞれ別の参照があります。それらの間の違いは何ですか? –

+0

実際には 'test2'と' test3'は同じ参照です - 'test.ToString()'が返す中間の文字列別々です。これが 'string.Intern'を通過するとき、' test2'が 'ldstr'を介して取得した同じinterned版を取得します。 'test'は最初は' string'ではないので、同じ参照にすることはできません。 –

関連する問題