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()的源代码将会发现,只要连接字符串的长度超出缓冲区的当前大小,内部缓冲区确实会增加. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |