码迷,mamicode.com
首页 > Web开发 > 详细

.Net字符串驻留池

时间:2016-06-14 23:37:40      阅读:577      评论:0      收藏:0      [点我收藏+]

标签:

在.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指向驻留池内的对象。

.Net字符串驻留池

标签:

原文地址:http://www.cnblogs.com/tiantianle/p/5585680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!