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代码.我期望在第一种情况下创建一个新实例,并在第二种情况下更改实例的值,这显然没有发生,任何线索为什么?
所有有趣的东西都发生在这一行:
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()将会发现只要连接字符串的长度超出缓冲区的当前大小,内部缓冲区确实会增加.