特殊的她 大话String
注:以下都为个人参考其他博客和《你必须知道的.net》有感而想,有意见,欢迎交流
引言
以前有这样的疑惑:1、string是引用类型,还是值类型 2、string的恒定性是如何实现的
先上一段代码
string str1 = "abcde";
string str2 = "abc";
string str3 = str2 + "de";
string str4 = "abcde";
bool b1 = ReferenceEquals(str1, str3);
bool b2 = ReferenceEquals(str1, str4);
Console.WriteLine(b1+","+b2); //结果 false,true
Console.Read();
string str2 = "abc";
string str3 = str2 + "de";
string str4 = "abcde";
bool b1 = ReferenceEquals(str1, str3);
bool b2 = ReferenceEquals(str1, str4);
Console.WriteLine(b1+","+b2); //结果 false,true
Console.Read();
代码解析:
先来说说b2为true,这首先让我们知道了,str1和str4变量指向同一对象实例
那么为什么 str1和str3同为“abcde”字符串而不指向同一对象实例呢?
这样我们就要引入一个驻留池(其实就是一个hash table),这个驻留池维护着一切非动态创建的字符串
string str1 = "abcde"; 执行他的时候,我们先去驻留池中查看是否含有"abcde"的记录
如果没有,在驻留池中添加一条“abcde”的记录,并将value赋给str1
如果有,直接找出value赋给str1。因此 str1的引用地址=str2的引用地址
但是动态创建的string ,不会往驻留池添加进行维护,因此返回false
我们可以调用String.Intern(string str) 将str放入驻留池进行维护