stringbuilder C#重点讲解之StringBuilder类( 二 )
文章图片
可以看出,新添加的字符A放在字符数组的位置0,字符数组中的元素个数为1。
b)然后添加一个字符b:
文章图片
此时,新字符b被放置在字符数组的第一个位置。显然,字符数组m_ChunkLength的有效长度增加了1,然后该值为2。此时,m_chunkPrevious仍然为空。
c)然后我们添加另一个字符c:
文章图片
【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:
文章图片
在最后一步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。如图:
文章图片
第四节常用方法
(1)追加方法和重载
公共不安全字符串生成器追加(字符串值)
向StringBuilder添加新元素,这里使用不安全,因为指针是内部使用的。它有18个重载,不管是哪一个重载方法,新的值最终都会转换成字符来添加。还有类似的AppendFormat系列方法。
(2)插入方法和重载
公共不安全字符串生成器插入(整数索引,字符串值)
推荐阅读
- 英雄联盟12.2版本约德尔人改动讲解,小炮后期改动
- 《艾尔登法环》和《阴阳师:妖怪小班》是重点关注对象
- 钓的重点是诱饵
- 过年谨防节日病!长治市人民医院肝胆外科?副主任霍凌波将走进《直通大医院》为您讲解急性胰腺炎相关知识
- 警惕!幽门螺杆菌被列为致癌物,这3类人群须重点筛查!
- 光遇:光遇国服先祖复刻公布白棉裤、蹦迪动作是重点
- 划重点!公共场所是否科学佩戴口罩,是流调判断风险等级的重要指标
- 直播预告丨我与医生面对面:德州天瑞体检中心专家讲解乳腺疾病的诊断与治疗
- 王者荣耀:周年庆第四期重点活动爆料,杨玉环新皮肤?
- 天津1月13日新增34例本土新冠肺炎确诊病例 14日重点人群筛查已检出14例阳性