また、アイテムクリア処分を呼び出していますか?
-
21-09-2019 - |
質問
何回ものコレクションからすべての項目を削除する明確な方法がある、これらの項目も配置されてます。
のように、
toolStripMenuItem.DropDownItems.Clear();
は十分であるか、私はそのようにコールする必要があります
foreach (ToolStripItem item in toolStripMenuItem.DropDownItems)
{
toolStripMenuItem.DropDownItems.Remove(item);
item.Dispose();
}
編集:まあのToolStripItemは一例ではないTabControlのは、アイテムの収集と明確な方法があり、クリアは十分に私は別の例を見ていると言う方に質問です。しかしTabControlsは(少なくとも私は)、明示的に廃棄する必要がある複雑なコントロールを持つことができます(これらはGCによっていくつかの時点で自動的に配置されている場合でも、彼らは巨大なメモリを取る原因となります)。私は最高の答えは明確に呼び出してアイテムを配置し、するDIVOコメントであると思います。
解決
Q:<?em>のないの
A:のないの - Clear
は(彼らはあなたのアプリケーションの他の部分に使用することができる)の項目を設けていません。
ですから、十分でClear
でしょうか?いくつかの反射の後、私は「多分ない」と言うだろう。
うん、これはのデストラクタのクラスを使用します(あなたのアプリケーションの他の部分でのToolStripItemへの参照を持っている場合は、.NET のGarbageCollectorのが破壊することは事実であります)が自動的に。しかし、それはを呼び出しません。のDispose(true)
の方法の、あること、しかし、フォームのIDisposable
コンポーネントに必要なます。
実は、私は明示的のToolStripのの処分のようにメソッドが(このののyourToolStrip でを置き換えない、あなたのアイテムをDispose
に必要、しかし、あなたはと考えていますEM>):
if (!this.Items.IsReadOnly)
{
for (int i = this.Items.Count - 1; i >= 0; i--)
{
this.Items[i].Dispose();
}
this.Items.Clear();
}
EDIT
私も作成 >より一般的に、この質問を明確にします。
他のヒント
あなたはアンマネージメモリ、共有リソースや大容量のメモリ領域を扱っているDispose()
コールに依存している必要があります。この場合ようではありません。
の項目を設けていないClear
を呼び出すと、それはアイテムをコレクションからの参照を削除します。それはいくつかの点で、彼らはゴミを自動的に収集されるアイテムへの参照のみだった場合(あなたが予測することはできませんが、GC
クラスを使用して制御することができる)。
私はあなたが後で使用するために、コレクション内のそのオブジェクトへの参照を持っている可能性があるので、それは多くの論理的な問題を引き起こす可能性があり、より多くの、そうは思いません。あなたは、ガベージコレクタが後で
そのオブジェクトを配置しますオブジェクトことへの参照を持っていない場合