我读到 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 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1074240/