System.Text.StringBuilder限制

Moa*_*ini 3 .net c# string performance

我已经读过StringBuilder类型有一个限制(默认是16个字符),当你向它附加一些文本时,超出它的限制,会创建一个具有更高限制的新实例,并将数据复制到它.我尝试使用以下代码:

StringBuilder test = new StringBuilder("ABCDEFGHIJKLMNOP",16);
test.Append("ABC");
Run Code Online (Sandbox Code Playgroud)

为此生成的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
Run Code Online (Sandbox Code Playgroud)

将限制设置为,例如,32:

StringBuilder test = new StringBuilder("ABCDEFGHIJKLMNOP",32);
test.Append("ABC");
Run Code Online (Sandbox Code Playgroud)

生成完全相同的IL代码.我期望在第一种情况下创建一个新实例,并在第二种情况下更改实例的值,这显然没有发生,任何线索为什么?

Jør*_*ode 8

所有有趣的东西都发生在这一行:

IL_0014:  callvirt   instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)
Run Code Online (Sandbox Code Playgroud)

这是您调用Append()方法的地方,但您发布的IL不包含该方法的主体.查看StringBuilder类的源代码(它是在允许您查看的许可下发布的),并查看该Append()方法中发生的情况.

扰流板警报!看一下源代码Append()将会发现只要连接字符串的长度超出缓冲区的当前大小,内部缓冲区确实会增加.