我试图更好地理解字符串在 C# 中的实习,并遇到了以下情况:
string a ="Hello";
string b ="Hello";
string c = new string(new char[]{'H','e','l','l','o'});
string d = String.Intern(c);
Console.WriteLine(a==b);
Console.WriteLine(c==d);
Console.WriteLine((object)a==(object)b);
Console.WriteLine((object)c==(object)d);
我在控制台中得到以下结果:
真真
真
假
对我来说,错误是为什么第 4 个是假的?
如果你没有创建a
(和b
(,那么Console.WriteLine((object)c==(object)d);
会导致True
。
但是,在您执行string d = String.Intern(c);
字符串时,由于a
,字符串"Hello"
已存在于字符串实习生池中,因此对实习生c
的调用会找到已经存在的"Hello"
并将其返回。
因此,如果"Hello"
尚未被拘留,那么c
的"Hello"
将被拘留,在这种情况下,返回的d
将等于c
。
证明:如果你做Console.WriteLine(b==d); it should return
真的'。 (我敢打赌会的。
文档说该方法返回
系统对 str 的引用(如果它被扣留(;否则,对值为 str 的字符串的新引用。
并在备注中:
如果将同一文本字符串分配给多个变量,则运行时将从实习生池中检索对文本字符串的相同引用,并将其分配给每个变量。
显然,从 char 数组中创建字符串"Hello"
会导致不相同的文字字符串,并且它似乎不会最终进入池中。 将 C 线更改为string c = "Hello"
会导致输出True