.Net 【基础回顾】String脚踏两条船
摘要
string
虽然是引用类型,但使用过程中却又有很多值类型的特征。
字符串恒定性
一旦创建了一个string
,在managed heap上分配了一块连续的内存空间,之后将不能以任何方式对这个string
进行修改使之变长、变短、改变格式。
所有对这个string
进行各项操作(比如调用ToUpper
获得大写格式的string
)而返回的string
,实际上另一个重新创建的string
,其本身并不会产生任何变化
字符串驻留机制
string str1 = "ABCD1234";
string str2 = "ABCD1234";
object.ReferenceEquals(str1, str2) //返回True;
object.ReferenceEquals(str1, "ABCD1234")) //返回True;
上面的代码返回就是string
驻留机制的作用:
由于String
是使用频率最高的一种类型,CLR考虑性能的提升和内存节约上,对于相同的字符串,一般不会为他们分别分配内存块,相反地,他们会共享一块内存。
注意⭐:对一个动态创建的字符串(比如string+variable;variable+variable),这种驻留机制便不会起作用。
string str3 = "ABCD";
string str4 = "1234";
string str5 = "ABCD" + "1234";
string str6 = "ABCD" + str4;
string str7 = str3 + str4;
object.ReferenceEquals(str1, str5) //True
object.ReferenceEquals(str1, str6) //False
object.ReferenceEquals(str1, str7)) //False
StringBuilder
由于String
的字符串恒定性,所以在大量string
拼接的时候,需要不停的创建和释放对象,从而影响程序的性能,而StringBuilder
通过Append
或者AppendLine
函数添加,不会不停的创建新的对象。
⭐ c# 中没有StringBuffer
这个类,这个是Java中的,大概是看了面经,并没有实际去实践。