C# String和StringBuilder的区别及性能详解

StringC#中其实是不可变的,每次操作字符串变量增加或减少时,都会重新分配内存。试想一下,如果创建一个循环10000次的字符串加减操作,每次循环都将一个字符连接到字符串,这样内存中就会有10000个字符串,每个字符串仅仅与前一个字符串相伴只是有一个字符不同,性能影响是很大的。这个时候我们可以使用StringBuilder分配一个缓存,其实就是创建个工作区,然后在工作区中对字符串应用StringBuilder类的相关方法。例如Append,Remove,Insert,Replace等。执行完之后,调用ToString方法把工作区中的内容转换为一个字符串,方便赋给一个字符串变量,相比之下在需要大量操作字符出变动时,应当使用StringBuilder提升程序性能。

String

  • 它是引用类型,在堆上分配内存
  • 每次增加&减少字符串时会产生一个新的实例
  • String 对象一旦生成不可改变
  • 定义相等运算符(== 和 !=)是为了比较 String 对象的值

在.NET中String是不可改变的引用类型对象,一旦创建了一个String对象并给它赋值,它就是不可再变的。这话听起来似乎有些不可思议,大家也许马上会想到字符串连接操作,我们不也可以改变字符串吗?让我们看下下面的这段代码

public static void Main(string[] args)
{
    string str ="123";
    Console.WriteLine(str); //输出 123
    str = str+"456"; 
    Console.WriteLine(str); //输出123456
    Console.Read(); 
}

看起来似乎是把str的值从"123"改为了"123456",实际上并没有改变。string str = "123";是创建了一个String对象它的值是"123",sstr指向了它在内存中的地址,s += "456";是创建了一个新的String对象它的值是"123456",str指向了新的内存地址。这时在堆中其实存在着两个字符串对象,尽管我们只引用了他们中的一个,但字符串"123"仍然在内存中驻留。

StringBuilder

StringBuilder对象为动态字符串,可以对其设置好的字符数量进行扩展。另外,还可以设置一个最大长度,这个最大长度称为该StringBuilder对象的容量,属性名叫Capacity。
为StringBuilder设置容量的意义在于,当修改StringBuilder字符串时,当实际字符长度未达到其容量之前,StringBuilder不会重新分配空间,StringBuilder默认初始分配16个字符长度;手动设置容量的方式有两种,代码如下

//通过构造函数设置容量
StringBuilder sb1=new StringBuilder("cisharp.com",100);
//通过Capacity属性设置容量
StringBuilder sb2=new StringBuilder("cisharp.com",100);
sb.Capacity=100;

StringBuilder常用方法

StringBuilder sb = new StringBuilder();
//追加字符串
sb.Append("111");
//追加一行
sb.AppendLine("111");
//插入字符串
sb.Insert(0, "22");
//移除字符串
sb.Remove(0, 2);
//替换字符串
sb.Replace("22", "33");

转载自:C# String和StringBuilder的区别及性能详解

posted @ 2022-09-23 15:00  零壹贰叁肆  阅读(348)  评论(0编辑  收藏  举报