我试图更好地理解字符串在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);
我在控制台中收到以下结果:
真
真
真
错误
我的错误在于为什么第四个错误?
答案 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"