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

时间:2017-07-13 07:06:11

标签: 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);

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

  


  真
  真
  错误

我的错误在于为什么第四个错误?

2 个答案:

答案 0 :(得分:4)

如果您尚未创建a(和b),则Console.WriteLine((object)c==(object)d);会产生True

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

因此,如果"Hello"尚未被实习,那么"Hello"的{​​{1}}将被实习,在这种情况下,返回的c将等于d

证明:如果你做c真。 (我打赌它会。)

答案 1 :(得分:1)

documentation表示方法返回

  

系统对str的引用,如果是实体的话;否则,对值为str。

的字符串的新引用

并在备注中:

  

如果将相同的文字字符串分配给多个变量,运行时将从实习池中检索对文字字符串的相同引用,并将其分配给每个变量。

显然从char数组创建字符串Toast.makeText(this,"aaa",Toast.LENGTH_SHORT).show(); 不会导致相同的文字字符串,并且它似乎不会在池中结束。将c-line更改为"Hello"会产生string c = "Hello"

的输出