zoukankan      html  css  js  c++  java
  • C# string

    1、string 是不可变的

    每次对string的修改,都相当于重新创建一个string对象(驻留池中没有),返回引用。string是一个特殊的引用类型,具备值类型的特点。一般的引用类型,修改引用使其指向另一个对象,与修改引用对象的内容,是两个完全不同的概念。但是,对于string类型,对string内容的修改,会导致指向另一个string对象。因此,对于字符串频繁变化的情况,强烈建议使用StringBuilder

    2、为什么把string设计成不可变的?

    首先,string是程序中用到最多的类型,把string设计成不可变的,不会发生线程同步的问题。A线程访问string变量str,把str传递给str2,线程B对str2的修改,不会影响str。

    其次,把string设计成不可变的,意味着,内容相同的引用可以指向同一块内存,节约内存。

    3、怎么实现的?

    CLR初始化创建一个哈希表,在这个表中,key是字符串,value是是对字符串的引用。当一个新的string对象,初始化为文本常量,首先检查哈希表中是否包含该文本常量。如果包含,返回已经存在的引用。如果不包含,新建string对象,添加到哈希表,并返回引用。这样,就避免了重复分配内存。除非卸载AppDomain或者进程终止,否则内部哈希表的string对象不能被释放。

    4、驻留池注意事项

    只有文本常量的字符串才会进入驻留池,其他方式新建的字符串不会进入,也就是说,相同字符串在内存中可能会有多个拷贝。为了解决这个问题,可以使用String.Intern方法强制到驻留池中查找。

  • 相关阅读:
    九连环
    杨辉三角
    魔术师发牌问题(循环链表)
    Linux 技巧:让进程在后台可靠运行的几种方法
    博客新地址
    x&(-x)取x的最后一个1的证明
    c++对象模型布局分析
    c++ 子类要正确的调用父类构造函数
    hibernate ID 生成方式
    IOCP
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3323969.html
Copyright © 2011-2022 走看看