stringbuilder C#重点讲解之StringBuilder类

挑选

stringbuilder C#重点讲解之StringBuilder类


文章图片

几乎所有的资料都告诉我们,字符串拼接操作频繁的时候推荐使用StringBuilder,因为它提供了更好的性能。我们孜孜不倦的写了一个例子来验证,真的很像传说!但是为什么StringBuilder在操作字符串方面有出色的表现呢?是不是真的像很多资料说的“每次新加的字符串和旧字符串的总长度超过设定的容量,就会新键入一个数组来存储字符串,旧数组就被丢弃了”?让我们来看看这一部分。
第一节字符串生成器
前面几章我们已经知道,字符串是由字符组成的。因为字符串是不可变的,所以每次更改字符串时,都会重新分配内存,创建一个字符串对象,并丢弃旧对象。在内存重新分配的过程中,可能会造成垃圾收集,这一系列操作会对性能造成很大的损害。为了解决这个问题,FCL提供了一个系统。构造管理字符串的类。就像它的名字一样,它是一个构造函数,提供了追加、移除和替换字符串的功能。当将字符串附加到StringBuilder对象时,它们实际上被转换为内部附加字符。系统。StringBuilder类有几个重要的字段、属性和方法。让我们一个一个来看。
第2节字段和属性
(1)内部字符[] m_ChunkChars
保存由StringBuilder管理的字符串中的字符。默认情况下,系统将其长度初始化为16。当新添加的字符串长度和旧字符串长度之和大于字符数组的容量时,新创建的字符数组的容量将增加到“2的幂(n+1)”(假设当前字符数组容量是2的幂)。
(2)内部int m _ ChunkLength
字符数组m_ChunkChars中的实际字符数,m_ChunkChars的系统默认容量为16。
(3)内部int m _ ChunkOffset
字符定位偏移
(4)内部StringBuilder m _ ChunkPrevious
内部的StringBuilder对象。当附加字符串的长度和旧字符串的长度之和大于字符数组m_ChunkChars的最大容量时,将根据当前(this)StringBuilder创建一个新的StringBuilder对象,m_ChunkPrevious将指向新创建的StringBuilder对象。这是关键。
(5)公共整数长度;
当前StringBuilder对象实际管理的字符串长度。长度= m _ chunk长度+ m_ChunkOffset
(6)公共智力;
设置或获取字符数组m_ChunkChars的最大容量。
第三节,StringBuilder追加字符串时的内部工作
创建新的StringBuilder对象后,字符数组m _ chunkcchars的最大容量初始化为16,字符串追加到StringBuilder对象中。如果追加前后字符串的总长度小于或等于16,新追加的字符串的字符将被复制到m _ chunkcchars数组中。如果追加前后的字符串总长度大于16,首先用新字符填充当前的m_ChunkChars,然后基于当前对象(this)构造一个StringBuilder对象,将m_ChunkPrevious指向这个新创建的StringBuilder对象,然后将Capacity设置为2 (n+1) 32的幂。重新初始化字符数组m_ChunkChars,使其容量为2的(n+1) 32次方(注意:这不是必须的),然后将剩余的字符复制到最新的字符数组m_ChunkChars中。每次添加字符串时,都会执行与上面类似的步骤。我们来看看这个过程。为了便于演示,在创建一个StringBuilder对象后,我们首先将容量设置为2。以下代码:
StringBuilder strBuilder = new StringBuilder();
strBuilder。容量= 2;
初始化后看结果:

stringbuilder C#重点讲解之StringBuilder类


文章图片

可以看到,最大Capacity为2,由于没有附加字符串,字符数组m_ChunkChars的元素为空,m_ChunkPrevious为空。
a)然后我们附加一个字符串“a”:

stringbuilder C#重点讲解之StringBuilder类

推荐阅读