C# String与StringBuilder

时间:2022-05-09 01:45:33

1.什么时候用String?什么时候用StringBuilder?

字符串一旦创建就不成改削巨细,每次使用System.String类中的要领之一时,都要在内存中创建一个新的字符串东西,这就需要为该新东西分配新的空间。在需要对字符串执行反复改削的情况下,与创建新的String东西相关的系统开销可能会非常昂贵。如果要改削字符串而不创建新的东西,,则可以使用System.Text.StringBuilder类。例如当在一个循环中将许多字符串通接在一起时,使用StringBuilder类可以提升性能。

所以对字符串添加或删除操纵不频繁的话,就几个固定的string累加的时候就不需要StringBuilder了,终究StringBuilder的初始化也是需要时间的。对字符串添加或删除操纵对照频繁的话那就用StringBuilder。

String a1 = "abc";  //分配固定的内存巨细 a1+="def";  //创建新的内存分配a1,价钱对照昂贵 StringBuilder sb = new StringBuilder(20);  //指定分配巨细 sb.Append(‘abc‘);  //分配到堆区 sb.Append(‘def‘);  //不会被销毁,而是直接追加到后面。

总结:上面的a1和sb在输出功效一样的。但是在内存分配上面来说就区别很大了。

2.String与StringBuilder的区别

String声明之后在内存中巨细是不成改削的,而StringBuilder可以*扩展巨细(String分配在栈区,StringBuilder分配在堆区)

1)String(C# string 字符串详解)

String s1 = new String(new char[] { ‘c‘, ‘h‘, ‘i‘, ‘n‘, ‘a‘ }); String s2 = "abc";

2)StringBuilder

StringBuilder sb = new StringBuilder(5); //当指定分配巨细之后,性能就会得到提升。在到达容量之前,它不会为其本身从头分配空间。如果赶过指定巨细系统会当前巨细倍增,也就10,15,20。建议指定巨细 sb.Append(‘china‘); sb.Capacity = 25; //此外,可以使用读/写Capacity属性来设置东西的最大长度。 //EnsureCapacity要领可用来查抄当前StringBuilder的容量。如果容量大于通报的值,则不进行任何变动;但是,如果容量小于通报的值,则会变动当前的容量以使其与通报的值匹配。 //也可以检察或设置Length属性。如果将Length属性设置为大于Capacity属性的值,则自动将Capacity属性变动为与Length属性不异的值。如果将Length属性设置为小于当前StringBuilder东西内的字符串长度的值,则会缩短该字符串。 //5个改削StringBuilder的内容的要领 StringBuilder.Append //将信息追加到当前StringBuilder的结尾。 StringBuilder.AppendFormat //用带格局文本替换字符串中通报的格局说明符。 StringBuilder.Insert //将字符串或东西插入到当前StringBuilder东西的指定索引处。 StringBuilder.Remove //从当前StringBuilder东西中移除指定数量的字符。 StringBuilder.WordStr //替换指定索引处的指定字符。 //Append //Append要领可用来将文本或东西的字符串暗示形式添加到由当前StringBuilder东西暗示的字符串的结尾处。 //以下示例将一个StringBuilder东西初始化为“Hello World”,然后将一些文本追加到该东西的结尾处。将按照需要自动分配空间。 StringBuilder sb = new StringBuilder("Hello World!"); sb.Append(" What a beautiful day."); Console.WriteLine(sb); //功效:Hello World! What a beautiful day. //AppendFormat //AppendFormat要领将文本添加到StringBuilder的结尾处,而且实现了IFormattable接口,因此可接受格局化部分中描述的标准格局字符串。可以使用此要领来自界说变量的格局并将这些值追加到StringBuilder的后面。 //以下示例使用AppendFormat要领将一个设置为货币值格局的整数值安排到StringBuilder的结尾。 int MyInt = 25; StringBuilder sb = new StringBuilder("Your total is "); sb.AppendFormat("{0:C} ", MyInt); Console.WriteLine(sb); //功效:Your total is $25.00 //Insert //Insert要领将字符串或东西添加到当前StringBuilder中的指定位置。 //以下示例使用此要领将一个单词插入到StringBuilder的第六个位置。 StringBuilder sb = new StringBuilder("Hello World!"); sb.Insert(6,"Beautiful "); Console.WriteLine(sb); //功效:Hello Beautiful World! //Remove //Remove要领从当前StringBuilder中移除指定数量的字符,移除过程从指定的从零开始的索引处开始。 //以下示例使用Remove要领缩短StringBuilder。 StringBuilder sb = new StringBuilder("Hello World!"); sb.Remove(5,7); Console.WriteLine(sb); //功效:Hello //WordStr //使用WordStr要领,可以用另一个指定的字符来替换StringBuilder东西内的字符。 //以下示例使用WordStr要领来搜索StringBuilder东西,查找所有的感伤号字符(!),并用问号字符(?)来替换它们。 StringBuilder sb = new StringBuilder("Hello World!"); sb.WordStr(‘!‘, ‘?‘); Console.WriteLine(sb); //功效:Hello World?

下面看一下在内存中如何分配的:如下图

C# String与StringBuilder

3)知道它们是如何分配之后,就可以很好的区分"==", "Equals", "Object.ReferenceEquals(obj1,obj2)"。

(1)在这==之前先讲一下:可能java措施员看到这里的时候会觉得有一点懵。在java中String类型它都是放在堆中的。而C#则差别,微软对String类型进行优化