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

  • C# String和StringBuilder的区别及性能详解已关闭评论
  • 125 次浏览
  • A+
所属分类:.NET技术
摘要

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