StringBuilderタイプには制限があり(デフォルトは16文字)、制限を超えていくつかのテキストを追加すると、上限が設定された新しいインスタンスが作成されますデータがコピーされます。System.Text.StringBuilder limit
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コード。 私が期待することは、最初のケースで新しいインスタンスを作成し、2番目のケースでインスタンスの値を変更することです。これは明らかに起こりませんでした。あなたはAppend()
メソッドへの呼び出しを行う場所です
IL_0014: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)
、しかし、あなたが投稿したILは、そのメソッドの本体が含まれていません:
しかし、結果のCILコードでは、文字列を操作するときに新しい文字列が作成されるのと同じように、CILコードを理解すると、新しい文字列ビルダが作成されます。 –
あなたが何を意味するか分かりません - ILのどこを探していますか?私は、コンストラクタ(IL_0008)への呼び出しとAppend()メソッド(IL_0008)への呼び出しの両方を見るだけです。これはあなたのC#コードをよく反映しているようです。 –
いいえ、新しいstringbuilderオブジェクトは作成されません。既存のstringbuilderは新しいBUFFERを割り当てます。 –