String Builder类使用探讨

时间:2022-10-23 04:51:10

摘要:首先对.Net Frameword中字符串内存的存放方式进行了分析,然后针对说明StringBuilder类的工作方式及性能对比,最后给出StringBuilder类常用的方法。

关键词:StringBuilder .Net Frameword 字符串 软件开发

中图分类号:TP311文献标识码:A文章编号:1009-3044(2009)33-9353-02

1 .Net Framework字符串存储方式及StringBuilder类突破点分析

StringBuilder是.NET Framework一个功能强大的新类,功能是对字符串进行拼接、插入、删除、替换等操作,从功能而言,并没有太大的突破,所有的平台语言对字符串操作都有相对应的功能,StringBuilder的价值在于能高效地实现这些功能,而不是简单的进行重复。

在解析StringBuilder的高效前,必须首先了解.Net Framework对字符串进行存储的一个重要特性:所有字符串对应的内存都是不可改变的,也就是说,字符串的内存存储单元是不可以更改的。在.Net Framework中不可以真正直接改变一个字符串变量的内容,如果更改了一个字符串的取值,那么该字符串原来对应的内存将被作废,而内存中一个新的地址将被重新创建并分配给字符串去存储新的取值。例如,下面的代码对字符串S的取值作出修改:

string S;

S = ¨AAA¨;

S = ¨BBB¨;

由于在.Net Framework中,内存中的字符串的存储内容不可以更改,每当你改变S的取值,.Net Framework都会在内存的一个新位置重新创建一个新的字符串,所有上面的程序会导致这样的一个结果:内存在某个位置(假定内存地址为3000)存放S,但位置3000什么都没有(只有S的初始值);然后在新的位置(3010)存储了字符串“AAA”,最后在第三个位置(3030)存储了字符串“BBB”。.Net Framework不断地创建新的字符串,同时不断改变S的索引,指向新的内存地址。可见,这种方式非常笨拙,虽然有效但效率不可能高。

StringBuilder类则以完全不同的方式工作,当你创建了StringBuilder类的实例后,你就定义了一个字符串的内存块,这个内存块的内容是可以被改变的,通过StringBuilder,我们可以直接改变字符串内存的内容。例如,运用StringBuilder实现上一个例子的功能:

System.Text.StringBuilderSB = new System.Text.StringBuilder();

SB.Append(¨AAA¨);

SB.Replace(¨AAA¨, ¨BBB¨);

.Net Framework首先在内存创建一个新的内存块(假定内存位置也是3000),开始内容为空,然后变成“AAA”,随后变成“BBB”。可见从功能的实现上,StringBuilder对比传统的方式有重大的突破,这是StringBuilder高效性的基础。

2 StringBuilder性能对比

这种直接修改内存的能力使StringBuilder具备明显的速度优势。我们可以通过两个简单的功能一样的循环程序进行验证。

首先我们不使用StringBuilder,使用传统方法,直接对string进行操作,对一个字符串进行10000次的拼接:

stringst = ¨¨;

for (int i=0;1

st += i.ToString();

st +=¨,¨;}

然后我们使用StringBuilder类来实现同样的功能:

System.Text.StringBuilderSB = new System.Text.StringBuilder();

for (int i=0;1

SB.Append (i);

SB.Append (,);}

在我的电脑,同样的硬件配置及系统环境中,使用传统方法程序运行5秒完成,使用StringBuilder的程序在1秒内完成!可见从效率上两者之间的差异是很大的。

3 StringBuilder各种功能的实现

3.1 拼接功能

在StringBuilder类中,Append和AppendFormat是最常用的两个方法,它们实现StringBuilder的拼接功能。Append方法可以直接把一个新值加入到字符串空间,而且新值的数据类型不需要进行转换。可以使用Append简单地把每一个变量的内容加入字符串,不用管这个变量的类型是什么,例如把一个bool类型的变量实例直接加入StringBuilder的实例中。

使用AppendFormat可以将各种类型的数据加入字符串空间,并且进行格式化。如下面的例子中,把double类型的变量dou直接加入StringBuilder 的实例SB,并进行格式化,程序运行后将会显示 $888.88:

double dou=888.88;

System.Text.StringBuilderSB = new System.Text.StringBuilder();

SB.AppendFormat (¨{0:c}¨,dou );

Reponse.Write(SB.ToString());

3.2 插入和删除功能

在StringBuilder类中,Inert实现插入功能。Insert方法中需给出起始位置和具体字符串值。如你想在字符串“AAA CCC”中插入“BBB”,成为“AAA BBB CCC”可以执行以下代码:

SB.Append(¨AAA CCC¨);

SB.Insert(4, ¨BBB ¨);

在StringBuilder类中,Remove实现删除功能。Remove方法中需给出起始位置和删除字符串的长度,如想把刚才执行完Insert的字符串去掉刚插入的“BBB”可以执行以下代码:

SB.Remove(4,4);

3.3 替代功能

在StringBuilder类中,Replace实现替代功能。Replace方法需要给需要替换的字符串和替代用的字符串,还可以指定范围。如你想把“ABCD ABCD”中的“AB”都换成“EF”,字符串变为“EFCD,EFCD”,可以执行以下代码:

SB.Append(¨ABCD ABCD¨);

SB.Replace(¨AB¨,¨EF¨);

如果只想把“ABCD ABCD”中第一个“AB”都换成“EF”,字符串变为“EFCD,ABCD”,可以指定替代范围,执行以下代码:

SB.Append(¨ABCD ABCD¨);

SB.Replace(¨AB¨,¨EF¨,0,4);

3.4 容量监控功能

在StringBuilder类中,通过Capacity属性设置StringBuilder实例的容量,你可以在实例化StringBuilder时设置初始的容量值,也可以通过类方法EnsureCapacity来自动分配字符串空间,以便随时容纳新数据,如果担心容量设置错误而造成程序报错,可以使用一个try…catch块进行恢复。

4 结论

.Net Framework中的字符串存储不可改变,使用StringBuilder类操作字符串比使用传统方法高效得多,值得在.Net Framework的开发中使用。

参考文献:

[1] 朱仲杰.Java2全方位学习[M].北京:机械工业出版社,2006.

[2] 赵克立.C#.NET 编程培训教程[M].北京:清华大学出版社,2003.

上一篇:Widget技术介绍及简单实现 下一篇:基于OWL的上下文感知计算模型