我读到了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代码。 我期望的是在第一种情况下创建一个新实例,在第二种情况下更改实例的值,但显然这并没有发生,有什么线索吗?