Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > Why are strings immutable?
【标  题】:Why are strings immutable?
【关键字】:Why,are,strings,immutable
【来  源】:http://blog.joycode.com/qqchen/archive/2004/08/21/31216.aspx

Why are strings immutable?

Your Ad Here

    一直都想当然的接受了“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就不能隐式的重用这些对象。

 

More On Strings: The Implementation:【上一篇】
Google Special Search:【下一篇】
【相关文章】
  • More On Strings: The Implementation
  • More on "More on Strings"
  • 关于访问SharePoint站点用Office打开文档提示输入用户名和密码的解决方法
  • 感恩节——Sharepoint TechTalk
  • Sharepoint可以做的更好
  • 提高Sharepoint站点访问速度的几点建议
  • Sharepoint 新闻联播
  • Ted Teng(MS Sharepoint MVP)的在线聊天活动
  • 抛砖引玉:关于 SharePoint 内容编辑器中的文件上传
  • Gates Pins Hopes on SharePoint
  • 【随机文章】
  • 安装rfws5
  • 一个将数据库里面的内容生成EXCEL的例子
  • ASP包含文件方法详解
  • FrontPage服务器扩展
  • VC小技巧(3)---右键菜单的使用
  • ReportBuilder Enterprise 7.02 for D6 (报表控件)
  • 金融IT公司与银行之比较
  • 从ACM会议看中国大陆计算机科学与国外的差距-- 灵芯
  • Count 和 NULL值 造成的问题
  • 如何生成静态页(转)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.