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");  

输出如下。

xyz
xyz
未实习

因此,从下面的代码示例中,字符串 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",因为它是一个字符串文字,所以它被实习。

然后,当您在运行时创建第二个字符串实例时,它等于内部编译时实例(但它仍然是不同的实例),因此IsInterned可以找到该字符串并返回它。您从未显式地实习过字符串值,"abc"也从未以任何方式将其指定为字符串文字。这就是为什么它默认不被实习的原因。

于 2012-05-17T18:41:01.967 回答
0

+1 对 Wormbo 和 SLaks 的回答。下面的单元测试给出了相等比较发生了什么的想法。

[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 回答