您的位置: 网站首页 > 程序开发 > C#程序设计 > 第3章 字符串操作 > 【3.2 动态字符串StringBuilder】

3.2 动态字符串StringBuilder

 

3.2  动态字符串StringBuilder

动态字符串StringBuilder比静态字符串String有很多优点,如内存的节省和效率的提高。对String进行改变操作时,每次都会产生一个原字符串的副本,而StringBuilder就不会。本节主要介绍动态字符串StringBuilder的相关内容。

3.2.1  声明StringBuilder变量

String类型的变量不同,使用StringBuilder时必须对System.Text命名空间进行引用,其引用方法如下:

using System.Text;

引用了System.Text命名空间后就可以直接使用StringBuilder声明变量,其主要方法有如下几种:

//声明一个空的StringBuilder变量

StringBuilder a = new StringBuilder();

//声明一个内容为“Thank”的StringBuilder变量

StringBuilder b = new StringBuilder(“Thank”);

3.2.2  StringBuilder的容量

C#中可以设置StringBuilder类型的变量的容量。当StringBuilder变量的字符数未超出设置容量时,不会分配新的内存空间。当字符数超出设置容量时,C#会自动为StringBuilder再追加分配其初始容量大小的内存空间。由此可见,StringBuilder适合大容量字符串的多次操作,比String类型的变量节约内存。可以在声明StringBuilder时进行容量的设置,其方法如下:

//声明一个空的StringBuilder变量

StringBuilder a = new StringBuilder(17);

//声明一个内容为“Thank”的StringBuilder变量

StringBuilder b = new StringBuilder("Thank",17);

也可以在声明之后再设置StringBuilder变量的容量,其方法如下。

//声明一个空的StringBuilder变量

StringBuilder a = new StringBuilder();

a.Capacity = 17;

//声明一个内容为“Thank”的StringBuilder变量

StringBuilder b = new StringBuilder(“Thank”);

b.Capacity = 17;

也可以通过Capacity属性获取StringBuilder的容量大小。下面的实例演示了获取StringBuilder变量容量的方法。

1.目的说明

创建一个Windows控制台应用程序,演示Capacity属性的使用方法。

2.实现步骤

1)创建一个名为StrBuilderCapacity的控制台应用程序项目。

2)修改Program.cs文件中Main方法的内容如下:

static void Main(string[] args)

{

    //声明一个空的StringBuilder变量

    StringBuilder a = new StringBuilder();

    a.Capacity = 17;

    //声明一个内容为“Thank”的StringBuilder变量

    StringBuilder b = new StringBuilder("Thank");

    b.Capacity = 19;

 

    Console.WriteLine(a.Capacity);

    Console.WriteLine(b.Capacity);

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图3-11所示。

3-11  运行结果

4.代码分析

可以看到,运行结果中分别给出了StringBuilder变量ab的容量大小。

3.2.3  追加字符串

String类型变量的连接和直接使用“+”操作符不同,StringBuilder类型的变量需要使用Append方法进行相关的操作。追加字符串的操作非常简单,其格式如下:

public StringBuilder Append(object value)

其中,value表示要追加的字符串,返回值为追加后的结果。下面通过一个实例演示其用法。

1.目的说明

创建一个Windows控制台应用程序,演示Append的使用方法。

2.实现步骤

1)创建一个名为StrBuilderCapacity的控制台应用程序项目。

2)修改Program.cs文件中Main方法的内容如下:

static void Main(string[] args)

{

    StringBuilder a = new StringBuilder("Thank");

 

    a.Append(" You");

    Console.WriteLine(a.ToString());

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图3-12所示。

3-12  运行结果

4.代码分析

从运行结果可以看到,将字符串“You”追加到了StringBuilder变量a的末尾,使其内容更改为“Thank You”,最后通过WriteLine方法输出。

3.2.4  插入操作

StringBuilder变量的插入其他字符操作与String类型变量十分类似,也是通过Insert方法支持,其格式如下:

public StringBuilder Insert(int index,object value)

其中,index表示插入的位置,value表示插入的值,返回值为插入后的结果。下面通过一个实例演示其用法。

1.目的说明

创建一个Windows控制台应用程序,演示Insert的使用方法。

2.实现步骤

1)创建一个名为StrBuilderInsert的控制台应用程序项目。

2)修改Program.cs文件中Main方法的内容如下:

static void Main(string[] args)

{

    StringBuilder a = new StringBuilder();

    a.Append("Thank You");

 

    a.Insert(6, "Thank You ");

    Console.WriteLine(a);

}

3.运行结果

Ctrl+F5组合键运行程序,结果如图3-13所示。

3-13  运行结果

4.代码分析

通过在变量a的中间插入字符串“Thank You ”,使变量a的内容变为“Thank Thank You You”。

3.2.5  删除部分字符

StringBuilder中的删除操作与String类似,都是通过Remove来执行,其常用格式如下:

public StringBuilder Remove( int startIndex, int length)

其中startIndex为起始位置,length表示删除的长度,返回值为删除后的结果。下面通过一个实例说明StringBuilderRemove操作的用法。

1.目的说明

创建一个Windows控制台应用程序,演示Remove的使用方法。

2.实现步骤

1)创建一个名为StrBuilderDelete的控制台应用程序项目。

2)修改Program.cs文件中Main方法的内容如下:

static void Main(string[] args)

{

    StringBuilder a = new StringBuilder();

    a.Append("Thank You");

 

    a.Remove(5, 4);

    Console.WriteLine(a);

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图3-14所示。

3-14  运行结果

4.代码分析

在对StringBuilder类型的变量使用Remove方法时,必须使用两个参数。第一个参数表明删除的起始位置,第二个参数表明删除字符串的长度。

3.2.6  替换部分字符

StringBuilder中使用Replace方法替换字符串,其常用格式如下:

public StringBuilder Replace(char oldChar, char newChar)

public StringBuilder Replace(string oldValue, string newValue,)

上述两种格式分别对应字符替换和字符串替换,其中oldCharoldValue为要替换的原字符或字符串,newCharnewValue表示目标字符和字符串,返回值为替换后的结果。下面用一个实例说明Replace的使用方法。

1.目的说明

创建一个Windows控制台应用程序,演示Replace的使用方法。

2.实现步骤

1)创建一个名为StrBuilderReplace的控制台应用程序项目。

2)修改Program.cs文件中Main方法的内容如下:

static void Main(string[] args)

{

    StringBuilder a = new StringBuilder();

    a.Append("Thank You");

 

    a.Replace("You", "Wang");

    Console.WriteLine(a);

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图3-15所示。

3-15  运行结果

4.代码分析

String类型变量的Replace方法类似,StringBuilder类型变量a中的子串“You”被替换为“Wang”。

3.2.7  StringBuilderString的比较

前面章节中已经介绍了StringBuilderString的差别,此处用一个实例说明StringBuilderString在处理字符串时的效率差别。

1.目的说明

创建一个Windows控制台应用程序,演示StringBuilderString在处理字符串时的效率差别。

2.实现步骤

1)创建一个名为StrBuilderCompare的控制台应用程序项目。

2)修改Program.cs文件中Main方法的内容如下:

static void Main(string[] args)

{

    string a = "";

    StringBuilder b = new StringBuilder();

 

    DateTime x1 = DateTime.Now;

    for (int i = 0; i < 5000; i++)

    {

        a += "Thank You, Xiao Wang";

    }

    DateTime x2 = DateTime.Now;

    Console.WriteLine((x2 - x1).TotalSeconds);

 

    DateTime y1 = DateTime.Now;

    for (int i = 0; i < 5000; i++)

    {

        b.Append("Thank You, Xiao Wang");

    }

    DateTime y2 = DateTime.Now;

    Console.WriteLine((y2 - y1).TotalSeconds);

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图3-16所示。

3-16  运行结果

4.代码分析

从运行结果可以看到,使用了String类型变量aStringBuilder类型变量b,分别执行了5 000次连接操作。在实验的计算机上,前者使用了1.742 5s左右的时间,而后者几乎可以忽略不计。代码中DateTime.Now可以得到当前的时间,而TotalSeconds可以得到与该时间差相等的秒数。读者可以尝试在计算机内存允许的范围内,增加字符串的长度和循环的次数,可以得出更加精确的结论。