0

私の理解では、リテラルは自動的に干渉します。以下のコード例を見てみましょう。

 string s = "x" + "y" + "z";  
 Console.WriteLine(String.IsInterned(s) ?? "Not Interned");  

 string ss = new string(new char[] { 'x', 'y', 'z' });  
 Console.WriteLine(String.IsInterned(ss) ?? "Not Interned");  

 string sss = new string(new char[] { 'a', 'b', 'c' });  
 Console.WriteLine(String.IsInterned(sss) ?? "Not Interned");  

次のように出力します。

xyzxyz
インターン
されていません

したがって、以下のコード例から、文字列sおよびssは、リテラルが自動的にインターンされることを証明します。文字列sssに同じことが当てはまらない理由がわかりません。

4

3 に答える 3

4

あなたは誤解していますIsInterned

IsInterned()渡した値と同じ値の文字列がプールにあるかどうかを確認します。渡したインスタンス自体がインターンされているかどうかはチェックしません。

"x" + "y" + "z"は抑留されているため、String.IsInterned(ss)そのインスタンスを返します。

于 2012-05-17T16:41:53.383 に答える
2

文字列のインターンは、最初はコンパイラによって行われます。定数畳み込みにより"x" + "y" + "z"、単一の文字列インスタンス"xyz"に折りたたまれます。これは、文字列リテラルであるため、インターンされます。

次に、実行時に2番目の文字列インスタンスを作成すると、それはインターンされたコンパイル時インスタンスと等しくなります(ただし、それはまだ別のインスタンスです)。そのため、IsInternedその文字列を見つけて返すことができます。の文字列値を明示的にインターンしたり、文字"abc"列リテラルとして指定したりすることはありません。そのため、デフォルトではインターンされません。

于 2012-05-17T18:41:01.967 に答える
0

Wormbo & SLaks の回答に +1。次の単体テストは、等価比較で何が起こるかを示しています。

[Test]
public void StringInterningTests()
{
    string a = "Hello";
    string stringFromCharArray = new string(new char[] {'H', 'e', 'l', 'l', 'o'});

    Assert.IsTrue("Hello" == a);
    Assert.IsTrue(stringFromCharArray == "Hello");
    Assert.IsTrue(new String(new char[]{'H','e','l','l','o'}) == stringFromCharArray);
}
于 2014-01-27T10:32:57.147 に答える