您的位置:首页 > 产品设计 > UI/UE

为什么StringBuilder比string效率高

2007-09-19 11:18 453 查看
我们先看一个例子

strings1="orange";

strings2="red";

s1+=s2;

System.Console.WriteLine(s1);//outputs"orangered"

s1=s1.Substring(2,5);

System.Console.WriteLine(s1);//outputs"anger"
大家都知道字符串对象是“不可变的”,

对字符串进行操作的方法实际上返回的是新的字符串对象。

在前面的示例中,将
s1
s2
的内容连接起来以构成一个字符串时,包含
"orange"
"red"
的两个字符串均保持不变。+=运算符会创建一个包含组合内容的新字符串。结果是
s1
现在引用一个完全不同的字符串。只包含
"orange"
的字符串仍然存在,但连接
s1
后将不再被引用。

大量的字符串相加的时候就会有很多想s1一样的不在被引用,从而造成资源的极大浪费.

我们在看看StringBuilder是如何处理这样的问题.
System.Text.StringBuildersb=newSystem.Text.StringBuilder();

sb.Append("one");

sb.Append("two");

sb.Append("three");

stringstr=sb.ToString();

Append方法,Append里面到底是如何实现的呢.

publicStringBuilderAppend(stringvalue)

大家注意这点stringstringValue=this.m_StringValue;

internalvolatilestringm_StringValue;

写到这里,需要有人见看到了volatile,也许不明白是什么意思,大概的说下.

volatile关键字实现了线程间数据同步,用volatile修饰后的变量不允许有不同于“主”内存区域的变量拷贝。

[code]换句话说,一个变量经volatile修饰后在所有线程中必须是同步的;任何线程中改变了它的值,所有其他线程立即

获取到了相同的值。理所当然的,volatile修饰的变量存取时比一般变量消耗的资源要多一点,因为线程有它自己的

变量拷贝更为高效。

this.NeedsAllocation(stringValue,requiredLength)

只有在需要的时候才去重新分配.


就分配空间和线程的使用上来讲,StringBuilder肯定比String要高,但是前提是使用频率比较高的情况下.


[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: