将实习字符串转换为对象后为False

Sam*_*sov 6 c# string

我试图更好地理解字符串在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);
Run Code Online (Sandbox Code Playgroud)

我在控制台中得到以下结果:




我的错误是为什么第四个假?

Mik*_*kis 4

如果您没有创建a( 和b),那么Console.WriteLine((object)c==(object)d);就会产生True

但是,在执行此操作时,string d = String.Intern(c);字符串"Hello"已存在于字符串实习生池中,因此a对实习生的调用c会找到已存在的字符串"Hello"并将其返回。

因此,如果"Hello"尚未被拘留,那么"Hello"ofc将被拘留,在这种情况下,返回的值d将等于c

证明:如果你做Console.WriteLine(b==d); it should returnTrue`。(我打赌一定会的。)

  • @SamvelPetrosov 的区别在于 c==d 将使用字符串重载来比较字符串(这是正常的字符串比较),而 (object)c == (object)d 将始终使用引用比较。我无法编辑上一篇文章,但我的意思是 (object)c == (object)d 返回 false (3认同)