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限制所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)