stringbuilder C#重点讲解之StringBuilder类( 二 )


文章图片

可以看出,新添加的字符A放在字符数组的位置0,字符数组中的元素个数为1。
b)然后添加一个字符b:

stringbuilder C#重点讲解之StringBuilder类


文章图片

此时,新字符b被放置在字符数组的第一个位置。显然,字符数组m_ChunkLength的有效长度增加了1,然后该值为2。此时,m_chunkPrevious仍然为空。
c)然后我们添加另一个字符c:

stringbuilder C#重点讲解之StringBuilder类


文章图片

【stringbuilder C#重点讲解之StringBuilder类】可以看出,strBuilder的角色Capacity已经变成了2 (1+1)对4的幂。由于原来长度为2的数组m _ chunkcchars无法再加载长度为3的字符串,所以需要创新性地创建一个数组来扩展容量。但是,使用旧容量(值2)创建的数组已经被用来容纳新添加的字符串C,因此数组m _ chunkcchars仍然被初始化为容量为2的数组。strBuilder中已经有3个字符,Length = m _ chunk Length+m _ chunk offset,所以长度为3,最新的字符c已经放在新数组m_ChunkChars的0位。最重要的是字段m_ChunkPrevious不再空为null,并且它已经指向了步骤b)中的strBuilder对象,这可以从StringBuilder的内部代码中看出:
private void expandbyblock(int minBlockCharCount)
{
if ((minBlockCharCount + this。长度)>;this.m_MaxCapacity)
{
抛出新的ArgumentOofRangeException(“Required Length”),环境。GetResourceString(" argumentout of range _ small capacity ");
}
int num = Math。Max(minBlockCharCount,Math。敏(这个。长度,0x1f 40));
this . m _ chunk Previous = new StringBuilder(this);this . m _ chunk offset+= this . m _ chunk length;this . m _ ChunkLength = 0;
if((this . m _ chunk offset+num)& lt;数字)
{
this.m _ ChunkChars = null
抛出新的out of memory exception();
}
this . m _ ChunkChars = new char[num];
}
实际上,首先初始化m_ChunkPrevious,然后创建一个新的字符数组m _ chunkcchars,最后将字符复制到数组m _ chunkcchars中。
d)然后我们连续添加两个字符d和e:

stringbuilder C#重点讲解之StringBuilder类


文章图片

在最后一步c)中,Capacity容量为4,字符数组也有一个空位置,所以当我们添加字符d时,我们仍然可以使用该数组,而无需迁移对象和重建数组。但是,在添加字符E时,由于字符总数5(abcde)已经超过了Capacity 4,此时将执行类似c)的步骤,最关键的两行代码是:
this . m _ chunk Previous = new StringBuilder(this);this . m _ ChunkChars = new char[num];
需要注意的是,为了节省内存,在StringBuilder中m_ChunkChars并不一定是按照每次2的(n+1)次方来计算的。它基于旧字符串和新添加字符串的总长度与最后容量之间的差异:
int num = Math。Max(minBlockCharCount,Math。敏(这个。长度,0x1f 40));this . m _ ChunkChars = new char[num];
最后,StringBuilder在内部基于字符数组m_ChunkChars维护一个链表m _ ChunkPreviou。如图:

stringbuilder C#重点讲解之StringBuilder类


文章图片

第四节常用方法
(1)追加方法和重载
公共不安全字符串生成器追加(字符串值)
向StringBuilder添加新元素,这里使用不安全,因为指针是内部使用的。它有18个重载,不管是哪一个重载方法,新的值最终都会转换成字符来添加。还有类似的AppendFormat系列方法。
(2)插入方法和重载
公共不安全字符串生成器插入(整数索引,字符串值)

推荐阅读