- C#从入门到精通(第4版)
- 明日科技
- 1320字
- 2020-11-28 16:23:19
5.3 可变字符串类
视频讲解:光盘\TM\lx\5\12可变字符串类.mp4
对于创建成功的字符串对象,它的长度是固定的,内容不能被改变和编译。虽然使用“+”可以达到附加新字符或字符串的目的,但“+”会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复地对字符串进行修改,将极大地增加系统开销。而C#中提供了一个可变的字符序列StringBuilder类,大大提高了频繁增加字符串的效率。本节将对其使用进行讲解。
5.3.1 StringBuilder类的定义
StringBuilder类有6种不同的构造方法,本节只介绍最常用的一种,其语法格式如下。
public StringBuilder(string value, int cap)
value:StringBuilder对象引用的字符串。
cap:设定StringBuilder对象的初始大小。
【例5.23】创建一个StringBuilder对象,其初始引用的字符串为“Hello World! ”,代码如下。
StringBuiIderMyStringBuilder=new StringBuilder("Hello World! ");
说明 类表示值为可变字符序列的类似字符串的对象。之所以说值是可变的,是因为在通过追加、移除、替换或插入字符而创建它后可以对它进行修改。
5.3.2 StringBuilder类的使用
StringBuilder类存在于System.Text命名空间中,如果要创建StringBuilder对象,首先必须引用此命名空间。StringBuilder类中常用的几个操作字符串的方法如表5.6所示。
表5.6 StringBuilder类中的常用方法及说明
下面通过实例来演示如何使用StringBuilder类中的这5种方法。
【例5.24】创建一个控制台应用程序,声明一个int类型的变量Num,并初始化为1000,然后创建一个StringBuilder对象LS,其初始值为“用一生下载你”,初始大小为100。最后使用StringBuilder类的Append、AppendFormat、Insert、Remove和Replace方法操作StringBuilder对象,代码如下。(实例位置:光盘\TM\sl\5\17)
static void Main(string[] args) { int Num=1000; //声明一个int类型变量Num并初始化为1000 //实例化一个StringBuilder类,并初始化为“用一生下载你” StringBuilder LS = new StringBuilder("用一生下载你",100); LS.Append("VS芸烨湘枫"); //使用Append方法将字符串追加到LS的末尾 Console.WriteLine(LS); //输出LS //使用AppendFormat方法将字符串按照指定的格式追加到LS的末尾 LS.AppendFormat("{0:C}", Num); Console.WriteLine(LS); //输出LS LS.Insert(0, "名称:"); //使用Insert方法将“名称:”追加到LS的开头 Console.WriteLine(LS); //输出LS //使用Remove方法从LS中删除索引15以后的字符串 LS.Remove(15, LS.Length-15); Console.WriteLine(LS); //输出LS //使用Replace方法将“名称:”替换成“一生所爱” LS.RepIace("名称", "一生所爱"); Console.WriteLine(LS); //输出LS Console.ReadLine(); }
程序的运行结果如图5.4所示。
图5.4 StringBuilder类中几种方法的应用
5.3.3 StringBuilder类与String类的区别
String对象是不可改变的,每次使用String类中的方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用StringBuilder类。例如,当在一个循环中将许多字符串连接在一起时,使用StringBuilder类可以提升性能。
【例5.25】创建一个控制台应用程序,在主方法中编写如下代码,验证字符串操作和可变字符串操作的效率。(实例位置:光盘\TM\sl\5\18)
static void Main(string[] args) { String str=""; //创建空字符串 //定义对字符串执行操作的起始时间 long starTime = DateTime.Now.Millisecond; for (int i = 0; i < 10000; i++) { //利用for循环执行10000次操作 str=str+i; //循环追加字符串 } long endTime=DateTime.Now.Millisecond; //定义对字符串操作后的时间 long time=endTime-starTime; //计算对字符串执行操作的时间 Console.WriteLine("String消耗时间:"+time); //将执行的时间输出 StringBuilder builder=new StringBuilder(""); //创建字符串生成器 starTime=DateTime.Now.Millisecond; //定义操作执行前的时间 for (int j = 0; j < 10000; j++) { //利用for循环进行操作 builder.Append(j); //循环追加字符 } endTime=System.DateTime.Now.Millisecond; //定义操作后的时间 time=endTime-starTime; //追加操作执行的时间 Console.WriteLine("StringBuilder消耗时间:"+time); //将操作时间输出 Console.ReadLine(); }
运行结果如图5.5所示。
图5.5 验证字符串操作和可变字符串操作的效率
通过这一实例可以看出,两者执行的时间差距很大。如果在程序中频繁附加字符串,建议使用StringBuilder。
闯关训练:制作一个程序,要求根据标点符号对字符串进行分行操作。