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。

闯关训练:制作一个程序,要求根据标点符号对字符串进行分行操作。