知秋一叶

日出而作,日入而息,凿井而饮,耕田而食,帝力何有于我哉
随笔 - 55, 评论 - 311, 引用 - 79

导航

工具

标签

每月存档

广告



访客

 

    一直都想当然的接受了“strings are immutable”的事实,倒是没有仔细深入地想过原因。Google了一下,也没有找到满意的答案。我觉得大概有下面这些原因:

  •  避免字符串拷贝:如果String的内容可以改变,那么多个对象最好不要保存同一个字符串的引用,否则其中一个改变了String的内容就可能造成程序错误。这在多线程的环境下尤其重要,如果String不是immutable,那么它的所有编辑成员函数(Append, UpperCase等等)都必须要保证县城安全,性能损失惨重。如果每个对象保存String的一份Copy,则会消耗大量内存。Immutable实际上是一种近似于Copy-On-Write的折衷实现。
  • 维护集合语义:String是最常用来作为集合(Map,Hashtable) 键值得类型,而一旦一个String对象被用作集合的键值,改变String的内容就会破坏集合的语义,造成程序错误。
  • String Interning: 几乎没有人在程序中显式调用过String.Intern方法,但是Interning可能是.NET对String做的最重要的优化。简单的说,CLR为系统中的所有常量字符串维护了一张Hash表,所谓Interning就是在这个Hash表中找到一个动态生成的字符串的等值对象。通常比较两个String是否相等我们需要逐个字符的比较,但是如果两个String都经过Interning处理,因为Hashtable中的String都是唯一的,我们只需要比较这两个String的引用是否相等(是否指向同一个对象)。下面是String.Intern的一个简单的例子:
            bool StringEquals(string a, string b) {
                    string ia = string.Intern(a);
                    string ib = string.Intern(b);
                    return Object.ReferenceEquals(ia, ib);
            }

     C#编译器在两个地方隐含的使用了String Interning: 1) 如果在源代码中多次出现同样的字符串,只有一个对应的String会被放在CLR的StringPool当中,这个String对象会在代码中多次引用到。2) C/C++不支持基于String的switch/case,但是C#支持,这就是通过Intern实现的:C#编译器先把switch对应的字符串进行Interning处理,然后和下面的case进行引用比较就可以了。
     显然,String的Intern语义依赖于其不可变性:如果系统Intern Pool中的字符串可能会被改变,CLR就不能隐式的重用这些对象。

 

相关文章

Loading...

打印 | 张贴于 2004-08-21 04:49:00 | Tag:.NET

留言反馈

#C# String 与 string的问题 编辑
C# String 与 string的问题
2007-07-27 01:05:00 | [匿名用户:xiaotian]
#C# String 与 string的问题 编辑
1. C#到底是什么时候传引用?什么时候传值?
2. String传值还是传引用
3. string和String有什么区别?
4. String为什么是Immutable,怎么实现的?
2006-03-28 16:10:00 | [匿名用户:kiss0kill]
#re: Why are strings immutable? 编辑
bool StringEquals(string a, string b) {
string ia = string.Intern(a);
string ib = string.Intern(b);
return Object.ReferenceEquals(ia, ib);
}

哈希键值 一样的。
2005-08-28 19:10:00 | [匿名用户:xmlol]
#re:Why are strings immutable? 编辑
Why are strings immutable?ooeess
2005-06-14 10:48:00 | [匿名用户:测汞]
#re:Why are strings immutable? 编辑
^_^,Pretty Good!
2005-04-16 01:43:00 | [匿名用户:尼威nivelco]
#re:Why are strings immutable? 编辑
^_^,Pretty Good!
2005-04-10 19:56:00 | [匿名用户:实验室操作台]
#关于String类型 编辑
Ping Back来自:blog.csdn.net
2004-12-20 15:10:00 | [匿名用户:brightheroes]
#re: Why are strings immutable? 编辑
注意Hash的定义哦,Hash算法从来都不保证不同的值生成的Hash值不同!
2004-08-22 08:18:00 | [匿名用户:Leo]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode MVC Blogger System