本篇文章给大家分享的是有关字符串与StringBuilder在c#中有什么区别,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
<强>简介区别强>
字符串的缺点是每次字符串变量的内容发生了改变时,都必须重新分配内存。你想想,如果创建一个迭代100000次的循环,每次迭代都将一个字符连接到字符串,这样内存中就会有100000个字符串,每个字符串仅仅与前一个字符串相伴只是有一个字符不同,性能影响是很大的。
StringBuilder通过分配一个缓存,就是一个工作区来解决这些问题,在工作区中队字符串应用StringBuilder类的相关方法。包括添加,删除,移除,插入和替换字符等等。执行完之后,将调用ToString方法把工作区中的内容转换为一个字符串,方便赋给一个字符串变量。这样StringBuilder会提升一些性能。
<强>字符串类型对象的特点:强>
1。它是引用类型,在堆上分配内存
2。运算时会产生一个新的实例
3。字符串对象一旦生成不可改变(不可变的)
4。定义相等运算符(==和!=)是为了比较字符串对象的值(而不是引用)
在。网中字符串是不可改变对象,一旦创建了一个字符串对象并给它赋值,它就不可能再改变,也就是你不可能改变一个字符串的值。这句活初听起来似乎有些不可思议,大家也许马上会想到字符串连接操作,我们不也可以改变字符串吗?看下面的这段代码:
public static void Main (String [], args) { ,,,string s =癮bc"; ,,,Console.WriteLine (s),,//输出,abc ,,,s =, s +“def",, ,,,Console.WriteLine (s),,//def ,,,Console.Read (),, }
看起来我们似乎已经把s的值从“abc"改为了“abcdef",实际上并没有改变.string s=癮bc",是创建了一个字符串对象它的值是“abc",年代指向了它在内存中的地址,s +=癲ef",是创建了一个新字符串的对象它的值是“abcdef",年代指向了新的内存地址。这时在堆中其实存在着两个字符串对象,尽管我们只引用了他们中的一个,但字符串“abc"仍然在内存中驻留。
前面说过字符串是引用类型,如果我们创建很多个相同值的字符串对象,它在内存中的指向地址应该是一样的。也就是说,当我们创建了字符串对象,它的值是“abc",当我们再创建一个值为“abc"的字符串对象str时它不会再去分配一块内存空间,而是直接指向了年代在内存中的地址。这样可以确保内存的有效利用。看下面的代码:
,, public static void Main (String [], args) ,,,{ ,,,,,string s =,“abc"; ,,,,,Console.WriteLine (s),,//输出,abc , ,,,,,添加(s);,,//调用下面方法, ,,,,,Console.WriteLine (s),,//输出,def ,,,,,Console.Read (); ,,,} ,,,public static void 添加(string str) ,,,{ ,,,,,str =,“def"; ,,,} ,,,//改变方法的参数,,使用ref关键字,, ,,,public static void Main (string [], args) ,,,{ ,,,,,string s =,“abc"; ,,,,,Console.WriteLine (s),,//,输出,abc , ,,,,,添加(ref s); ,,,,,Console.WriteLine(年代);//六边形abcdef ,,,,,Console.Read (); ,,,} ,,,public static void 添加(ref string  str), { ,,,,,str =,“def"; ,,,}
<强>设置StringBuilder容量强>
StringBuilder对象为动态字符串,可以对其设置好的字符数量进行扩展。另外,还可以设置一个最大长度,这个最大长度称为该StringBuilder对象的容量(容量)。
为StringBuilder设置容量的意义在于,当修改StringBuilder字符串时,当其实际字符长度(即字符串已有的字符数量)未达到其容量之前,StringBuilder不会重新分配空间;当达到容量时,StringBuilder会在原空间的基础之上,自动不进行设置,StringBuilder默认初始分配16个字符长度。有两种方式来设置一个StringBuilder对象的容量。
1。使用构造函数
, StringBuilder构造函数可以接受容量参数,例如,下面声明一个StringBuilder对象sb2,并设置其容量为100。
//使用构造函数 ,StringBuilder Mysb1=new StringBuilder (“Hello", 100);
2。使用能力读/写属性
,能力属性指定StringBuilder对象的容量,例如下面语句首先一个StringBuilder对象sb3,然后利用能力属性设置其容量为100 .