.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中的,大概是看了面经,并没有实际去实践。

posted on 2022-05-04 10:06  杏村牧童  阅读(43)  评论(0编辑  收藏  举报