在.Net中,对于相同的字符串,.Net会将它们指向同一个地址,它们是相同的实例。.Net中的字符串并不会更新,当更改一个字符串变量时,由于字符串的不可变性,.Net实际上是新创建一个字符串,而将变量地址指向新创建的字符串地址。
string s1 = "Hello"; string s2 = "Hello"; bool b = Object.ReferenceEquals(s1, s2); Console.WriteLine(b); //输入 True 它们是同一个实例
CLR默默地维护了一个叫做驻留池(Intern Pool)的表。这个表记录了所有在代码中使用字面量声明的字符串实例的引用。这说明使用字面量声明的字符串会进入驻留池,而其他方式声明的字符串并不会进入,也就不会自动享受到CLR防止字符串冗余的机制的好处了。
StringBuilder sb = new StringBuilder(); sb.Append("He").Append("llo"); string s1 = "Hello"; string s2 = sb.ToString(); bool b = Object.ReferenceEquals(s1, s2); Console.WriteLine(b); //输出 False 它们不是相同的对象
这里输出Fasle的原因是,虽然s1,s2是相同的字符串,但是由于s2不是通过字面量声明的,CLR在为ToString()返回值分配内存时,并不会到驻留池中去检查是否有值为"Hello"的字符串已经存在了,所以自然不会让s2指向驻留池内的对象。