将暂留字符串强制转换为对象后为 false



我试图更好地理解字符串在 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

最新更新