1. ホーム
  2. c#

.NETのStringBuilderの内容をクリアする最良の方法

2023-10-04 22:32:41

質問

StringBuilderを再利用するために、コンテンツをクリアする最善の方法(持続時間や消費リソースが少ない)は何だと思うかをお聞きしたいのです。次のようなシナリオを想像してください。

StringBuilder sb = new StringBuilder();
foreach(var whatever in whateverlist)
{
  sb.Append("{0}", whatever);
}

//Perform some stuff with sb

//Clear stringbuilder here

//Populate stringbuilder again to perform more actions
foreach(var whatever2 in whateverlist2)
{
  sb.Append("{0}", whatever2);
}

そして、StringBuilderをクリアする場合、2つの可能性が考えられます。

sb = new StringBuilder();

または

sb.Length = 0;

クリアするのに最適な方法とその理由を教えてください。

ありがとうございます。

EDIT: 私は現在の.NET 3.5バージョンで言及しました。

どのように解決するのですか?

.NET 2.0や3.5で行う場合は、このような拡張メソッドを書いてください。

/// <summary>
///     Clears the contents of the string builder.
/// </summary>
/// <param name="value">
///     The <see cref="StringBuilder"/> to clear.
/// </param>
public static void Clear(this StringBuilder value)
{
    value.Length = 0;
    value.Capacity = 0;
}

すると、このようにクリアすることができます。

someStringBuilder.Clear();

そして、4.0が出たときに、拡張メソッドを捨てて、4.0バージョンを採用することができます。

アップデイト : キャパシティをゼロに設定するのは、おそらく良いアイデアではないでしょう。同じインスタンスを再利用する場合、ビルダーに追加するときに再割り当てが保証されるからです。しかし、Capacityを非常に小さな値(例えば1)に設定するまで、ビルダーのインスタンス内のメモリは解放されない。Capacityプロパティのデフォルト値は16です。16 を使用するか、(効率は悪くなりますが)Capacity を 2 回設定することを検討するとよいでしょう。

  • メモリをクリアするために 1 または 0 に設定する
  • 元の容量値(16とは異なる場合があります)に設定すると、復元されます。