标签:abc string StringBuilder 驻留 地址 字符串
string 字符串
定义语法:string s=”abc” string str=new string(new char[]{‘a’,’b’,’c’})
string和String
string is an alias for String in the .Net Framework
string 是String的别名,string是C#的类型,String是.Net Framework的类型
string经过编译变成String,为了符合语法,建议使用string
Immutable字符串不变性
代码分析:
string s=”abc” 在堆上开辟空间存储变量s的值”abc”,在栈上存储s,将指针指向堆上的地址
s=”abcd” 在堆上开辟空间存储变量s的值”abcd”,将栈上的s指向的地址指向”abcd”
由图可知,字符串不变性是指字符串值的变更,原有值并不会立刻从内存中消失,而是等待GC回收,因此在有频繁字符串的切割、拼接等字符操作时,应当使用StringBuilder
Intern Pool 驻留池
驻留池是指CLR维护的一个HashTable,键为字符串的值,值为字符串在堆中的地址,存储的字符串是字面量字符串,当新的字面量字符串新建时,
如果驻留池中存在同值字符串,则新的字符串的引用指向该字符串的地址。
字面量字符串,string str=”abc” string str=@”abc” string str=”abc”+”def”
英文双引号包括的或@+英文双引号包括的
代码分析:
string s=”abc” 在堆区开辟空间存储变量s,在栈中存储s,并将引用指向堆中地址
string b=”abc” 检查驻留池中是否有”abc”,存在,在栈中新建变量b,将引用指向堆
变量b和s在堆中地址一致,说明驻留池机制也说明了字符串的不变性。
同时驻留池的存活周期同程序进程一致,为字符串的线程同步提供基础,即驻留池中的字符串是进程级
string和StringBuilder
StringBuilder 动态串,从字面意思来看,StringBuilder是的长度是可以变化的
StringBuilder是值类型,是为处理复杂频繁的字符串操作而存在的
代码分析:
StringBuilder sb=new Stringbuilder(“Hahaha”) 在堆中开辟空间存储变量sb,值为”Hahaha”,在栈中存sb,引用指向堆中地址
sb.Append(“123”) 根据栈中引用找到堆中地址,当初始分配内存不足,自动扩展,并将存放值变为”Hahaha123”
由图可看出StringBuilder是对同一块内存操作,而字符串的更改会占用内存,因此对于频繁的字符串操作
用StringBuilder,而对于次数较少用string,因为StringBuilder对内存操作占用CPU,在一定程度上影响性能。
标签:abc,string,StringBuilder,驻留,地址,字符串 来源: https://www.cnblogs.com/arvinzd/p/14143912.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。