StringBuilder
オブジェクトを効果的に破棄するにはどうすればよいですか?ユーザーが一度に複数のレポートを生成すると、アプリは大量のメモリを使用することになります。
私は以下が役立つかもしれないことをオンラインでいくつかのサイトで読みました:
StringBuilder sb = new StringBuilder(1000000);
// loop goes here adding lots of stuff to sb
exampleObject.Text = sb.ToString();
sb.Length = 0;
最後の行は本当に役に立ちますか?これに対処する他の方法はありますか?
注意:これは、ユーザーがアプリケーションを使い続けることを実際に妨げるものではありません。冗長なメモリ使用を回避する方法があるかどうか疑問に思っています。
いいえ、StringBuilder
は純粋に管理されたリソースです。あなたはそれへのすべての参照を取り除くべきです。他のすべてはガベージコレクターによって処理されます。
StringBuilder sb = ...;
// ... do work
sb = null; // or simply let it go out of scope.
.NETには、決定論的なdelete
はありません(単一のオブジェクトに割り当てられたメモリを解放するC++のように)。メモリを解放できるのはGCだけです。オブジェクトへのすべての参照を失うことにより、GCが必要に応じてオブジェクトの割り当てを解除できるようになります。 System.GC.Collect
メソッドを呼び出すことにより、ガベージコレクションを強制できます。ただし、自分が何をしているかを本当に理解していない限り、GCで操作することはお勧めしません。 GCは賢いです。それを強制することはめったに有益ではありません。
「過剰なメモリ使用量」が問題にならない限り、私はそれをそのままにして、心配しません。
.NETは、ほとんどの場合、十分なメモリが利用可能な場合にガベージコレクションを実行しないようにするのに十分スマートです。
多くのレポートを生成している場合は、レポートごとに新しいものを割り当てる代わりに、単一のStringBuilderを再利用することを検討できます。