我们先看一个例子
对字符串进行操作的方法实际上返回的是新的字符串对象。
在前面的示例中,将
s1 和 s2 的内容连接起来以构成一个字符串时,包含 "orange" 和 "red" 的两个字符串均保持不变。+= 运算符会创建一个包含组合内容的新字符串。结果是 s1 现在引用一个完全不同的字符串。只包含 "orange" 的字符串仍然存在,但连接 s1 后将不再被引用。大量的字符串相加的时候就会有很多想s1一样的 不在被引用,从而造成资源的极大浪费.
我们在看看StringBuilder是如何处理这样的问题.
Append方法,Append里面到底是如何实现的呢.
大家注意这点 string stringValue = this.m_StringValue;
internal volatile string m_StringValue;
写到这里,需要有人见看到了 volatile,也许不明白是什么意思,大概的说下.
volatile关键字实现了线程间数据同步,用volatile修饰后的变量不允许有不同于“主”内存区域的变量拷贝。
换句话说,一个变量经volatile修饰后在所有线程中必须是同步的;任何线程中改变了它的值,所有其他线程立即获取到了相同的值。理所当然的,volatile修饰的变量存取时比一般变量消耗的资源要多一点,因为线程有它自己的变量拷贝更为高效。this.NeedsAllocation(stringValue, requiredLength)只有在需要的时候才去重新分配.就分配空间和线程的使用上来讲,StringBuilder肯定比String要高,但是前提是使用频率比较高的情况下.