5
string s1 = "abc";
string s2 = "ab";
string s3 = s2 + "c";

Console.WriteLine(string.IsInterned(s3));           // abc
Console.WriteLine(String.ReferenceEquals(s1, s3));  // False

なぜs3がインターンしたのか理解できませんが、ReferenceEqualsFalseでした。

彼らはインターン プールに 2 つのコピーを持っていますか?

前もって感謝します。

4

3 に答える 3

6

それらは別個の参照です。文字列"abc"はリテラル文字列であるため、インターンされます。

s2 + "c"は .. にコンパイルさstring.Concat(s2, "c")れ、新しい (別の) 文字列参照になります。

于 2014-03-08T14:37:19.613 に答える
3

これは、その文字列の値が実際にインターンされている間 (リテラル "abc" のため)、インターンされた文字列と同じインスタンスではなく、 + 演算子によって生成されたインスタンスであるためです。

String.ReferenceEquals(s1, string.IsInterned(s3));

true を返します

于 2014-03-08T14:40:05.263 に答える