c# – System.Text.StringBuilder限制

c# – System.Text.StringBuilder限制,第1张

概述我已经读过StringBuilder类型有一个限制(默认是16个字符),当你向它附加一些文本时,超出它的限制,会创建一个具有更高限制的新实例,并将数据复制到它.我尝试使用以下代码: StringBuilder test = new StringBuilder("ABCDEFGHIJKLMNOP",16);test.Append("ABC"); 为此生成的CIL是: .maxstack 3 我已经读过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()的源代码将会发现,只要连接字符串的长度超出缓冲区的当前大小,内部缓冲区确实会增加.

总结

以上是内存溢出为你收集整理的c# – System.Text.StringBuilder限制全部内容,希望文章能够帮你解决c# – System.Text.StringBuilder限制所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1224186.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存