我讀過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