目录
1.string 与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