由于字符串具有不可变性的特点,所以有暂存池。
那么什么是暂存池,暂存池又有什么用呢??
因为字符串是引用类型,程序会存在大量的字符串对象,如果每次都创建一个字符串对象,会比较浪费内存、性能低,因此CLR做了"暂存池"(拘留池、缓冲池、暂存池),在一些情况下对于字符串对象进行了重用
接下来我们用一个小例子来证明一下
写入如下代码:
static void Main(string[] args)
{
string s1 = "test";
string s2 = "test";
string s3 = "te" + "st";
string s4 = new string(s1.ToCharArray());
string s5 = new string(new char[] { 't', 's', 'e', 't' });
Console.WriteLine(object.ReferenceEquals(s1,s2));
Console.WriteLine(object.ReferenceEquals(s1,s3));
Console.WriteLine(object.ReferenceEquals(s1,s4));
Console.WriteLine(object.ReferenceEquals(s1,s5));
Console.WriteLine(object.ReferenceEquals(s4,s5));
Console.ReadKey();
}
然后结果如下:
为什么会这样呢? 因为暂存池的关系,当在声明字符串s2时,发现内容和s1一样 ,已经存在,所以重用了test对象,所以s1和s2是True,s3我们进行反编译查看发现
最后生成的还是test,所以也为TRUE,后面s4,s5是生成两个新的对象所以是false。
上面代码一共有几个字符串对象:3个字符串对象,因为s1,s2,s3是同一个对象。
---本博客是学习以后记录知识,如有侵权,请联系删除!!!