c# string 与stringbuilder对比

目录

1.string 与stringbuilder是引用类型还是值类型

2:使用String连接字符串

3.StringBuilder

4.StringBuilder使用


1.string 与stringbuilder是引用类型还是值类型

MSDN官方说String和StringBuilder都是引用类型

引用类型:引用分配栈内存,引用类型本身的数据存储在堆中;

值类型:在函数中创建,栈内存;类中成员变量堆类型;

从理论角度出发,String类继承自Object类,而StringBuilder类继承自AbstractStringBuilder类,AbstractStringBuilder类又继承自Object类,两者都是源自Object类。String类是不可变类,它只能赋值一次,一旦内容发生变化,都会生成一个新的对象,而每次生成新对象都会对系统性能产生影响,降低.net编译器的工作效率。StringBuilder类是可变类,每次操作都是对自身对象进行操作,而不是生成新的对象,所占空间会根据内容的增加而扩充,因此,在做大量的修改操作时,不会因生成大量匿名对象而影响系统性能。

2:使用String连接字符串

例如实例化一个字符串string str="my",str对象的内存地址指向了堆里面的my,当使用str+="name"时,并不是改变my的值,而是在堆中分配了一段新的内存空间"myname“并引用给str,本质是创建了一个新的字符串赋值给了str。试想一下假如在循环中执行多次修改字符串操作,将会产生大量垃圾内存。而StringBuilder只会在实例化时或Capacity不够扩容时分配内存

3.StringBuilder

StringBuilder相当于char* a = new char[lenth];

开了一块堆内存专门存储字符串数据;

StringBuilder在创建对象时,可指定内存大小;

StringBuilder mStringBuilder = new StringBuilder("LittlePreilla",30);

当内存超出时,StringBuilder会自动将内存加倍;

mStringBuilder.Capacity = 10;		//设置内存
mStringBuilder.EnsureCapacity(10);	//检查内存,大于10不变,小于10改为10

4.StringBuilder使用

1)拼接

mStringBuilder.Append("aaa");
mStringBuilder.AppendFormat("aaa{0:D}",1012);

2)插入

mStringBuilder.Insert(1,"ddd");		//index下表位置   

3)移除

mStringBuilder.Remove(1,2);		//index下表位置开始,移除几位

4)替换

mStringBuilder.Replace("aaa","bbb");		

我个人格式化输出更喜欢用正则表达式,也非常方便;

int a = 10;
string str = $"aaa{10}bbbb";
//结果为 aaa10bbbb

猜你喜欢

转载自blog.csdn.net/qq_57212959/article/details/131576424