加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – System.Text.StringBuilder限制

发布时间:2020-12-15 19:30:50 所属栏目:百科 来源:网络整理
导读:我已经读过StringBuilder类型有一个限制(默认是16个字符),当你向它附加一些文本时,超出它的限制,会创建一个具有更高限制的新实例,并将数据复制到它.我尝试使用以下代码: StringBuilder test = new StringBuilder("ABCDEFGHIJKLMNOP",16);test.Append("ABC")
我已经读过StringBuilder类型有一个限制(默认是16个字符),当你向它附加一些文本时,超出它的限制,会创建一个具有更高限制的新实例,并将数据复制到它.我尝试使用以下代码:

StringBuilder test = new StringBuilder("ABCDEFGHIJKLMNOP",16);
test.Append("ABC");

为此生成的CIL是:

.maxstack  3
  .locals init (class [mscorlib]System.Text.StringBuilder V_0)
  IL_0000:  nop
  IL_0001:  ldstr      "ABCDEFGHIJKLMNOP"
  IL_0006:  ldc.i4.s   16
  IL_0008:  newobj     instance void [mscorlib]System.Text.StringBuilder::.ctor(string,int32)
  IL_000d:  stloc.0
  IL_000e:  ldloc.0
  IL_000f:  ldstr      "ABC"
  IL_0014:  callvirt   instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)
  IL_0019:  pop
  IL_001a:  ret

将限制设置为,例如,32:

StringBuilder test = new StringBuilder("ABCDEFGHIJKLMNOP",32);
test.Append("ABC");

生成完全相同的IL代码.
我期望在第一种情况下创建一个新实例,并在第二种情况下更改实例的值,这显然没有发生,任何线索为什么?

解决方法

所有有趣的东西都发生在这一行:

IL_0014:  callvirt   instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)

这是您调用Append()方法的地方,但您发布的IL不包含该方法的主体.在source code中查找StringBuilder类(它是在允许您查看的许可下发布的),并查看Append()方法中发生的情况.

扰流板警报!看一下Append()的源代码将会发现,只要连接字符串的长度超出缓冲区的当前大小,内部缓冲区确实会增加.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读