我读过StringBuilder类型有一个限制(默认值是16个字符),并且当你向它附加一些文本时,超出了它的限制,创建一个新的实例,其上限并将数据复制到它。我想,用下面的代码:System.Text.StringBuilder限制
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代码。 我期望的是在第一种情况下创建一个新实例,并在第二种情况下更改实例的值,这显然没有发生,任何线索为什么?
但是生成的CIL代码表明它不是,据我所知,CIL代码每当我向文件添加文本时都会创建一个新的字符串生成器,就像在处理字符串时创建新字符串一样。 – 2009-07-02 13:23:45
不确定你的意思 - 在IL中你在找什么?我只看到一个对构造函数(IL_0008)的调用,另一个对Append()方法(IL_0008)。这似乎很好地反映了你的C#代码。 – 2009-07-02 13:27:52
不,不会创建新的stringbuilder对象。现有的stringbuilder分配一个新的BUFFER。 – 2009-07-02 13:39:21