2008年5月3日星期六
StringBuilder与string实例比较区别
我们先看一个例子
string s1 = "orange";
string s2 = "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.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("one ");
sb.Append("two ");
sb.Append("three");
string str = sb.ToString();

Append方法,Append里面到底是如何实现的呢.
public StringBuilder Append(string value)

{
if (value != null)
{
string stringValue = this.m_StringValue;
IntPtr currentThread = Thread.InternalGetCurrentThread();
if (this.m_currentThread != currentThread)
{
stringValue = string.GetStringForStringBuilder(stringValue, stringValue.Capacity);
}
int length = stringValue.Length;
int requiredLength = length + value.Length;
if (this.NeedsAllocation(stringValue, requiredLength))
{
string newString = this.GetNewString(stringValue, requiredLength);
newString.AppendInPlace(value, length);
this.ReplaceString(currentThread, newString);
}
else
{
stringValue.AppendInPlace(value, length);
this.ReplaceString(currentThread, stringValue);
}
}
return this;
}

大家注意这点 string stringValue = this.m_StringValue;
internal volatile string m_StringValue;
写到这里,需要有人见看到了 volatile,也许不明白是什么意思,大概的说下.
volatile关键字实现了线程间数据同步,用volatile修饰后的变量不允许有不同于“主”内存区域的变量拷贝。
换句话说,一个变量经volatile修饰后在所有线程中必须是同步的;任何线程中改变了它的值,所有其他线程立即
获取到了相同的值。理所当然的,volatile修饰的变量存取时比一般变量消耗的资源要多一点,因为线程有它自己的
变量拷贝更为高效。
this.NeedsAllocation(stringValue, requiredLength)
只有在需要的时候才去重新分配.
就分配空间和线程的使用上来讲,StringBuilder肯定比String要高,但是前提是使用频率比较高的情况下.
本文转自:SEO基地
本文链接:http://www.11zhuce.com/seo/StringBuilder-string.html
相关文章 [查看与 StringBuilder string 相关的全部文章]- StringBuilder
0 回复,0 引用: StringBuilder与string实例比较区别
添加回复