string s1 = "test";
string s5 = s1.Substring(0, 3)+"t";
string s6 = s1.Substring(0,4)+"";
Console.WriteLine("{0} ", object.ReferenceEquals(s1, s5)); //False
Console.WriteLine("{0} ", object.ReferenceEquals(s1, s6)); //True
Run Code Online (Sandbox Code Playgroud)
字符串s5和s6都具有与s1相同的值("test").基于字符串实习概念,这两个语句必须已评估为true.有人可以解释为什么s5没有与s1相同的参考?
你应该false为电话ReferenceEquals对string不属于字符串文字对象.
本质上,最后一行True是巧合打印的:当你传递一个空字符串进行字符串连接时,库优化会识别出这一点,然后返回原始字符串.这与实习没有任何关系,因为从控制台读取的字符串或以任何其他方式构造的字符串也会发生同样的事情:
var s1 = Console.ReadLine();
var s2 = s1+"";
var s3 = ""+s1;
Console.WriteLine(
"{0} {1} {2}"
, object.ReferenceEquals(s1, s2)
, object.ReferenceEquals(s1, s3)
, object.ReferenceEquals(s2, s3)
);
Run Code Online (Sandbox Code Playgroud)
以上打印
True True True
Run Code Online (Sandbox Code Playgroud)