コントロールを手動で廃棄する必要があるのはいつですか?コントロールがIDisposableを実装しているかどうかを知るにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/615466

  •  03-07-2019
  •  | 
  •  

質問

以前のNotifyIconのシステムトレイの除去に関する質問で、IDisposableを実装するものはすべて破棄する必要があると言われました。私にとっては良い習慣のように思えますが、初心者の方が質問が多くなります:-)

コントロールがIDisposableを実装しているかどうかを知る方法

formclosedイベントのすべてのフォームのすべてを破棄しようとするクラスを構築する必要がありますか?

このようなものですか?(psuedocode):

foreach(control cont in form)  
{  
try{cont.Dispose()}  
catch{}  
}

そうでない場合、手動で破棄する必要があるコントロールをどのように知ることができますか、またはテスト中に異常な動作を単に監視する必要がありますか?

G

編集:そのため、大きな赤い" X"をクリックすると、私の子フォームでは、それはそれを破棄させませんか?そうですか?この理由は何ですか?

役に立ちましたか?

解決

フォームが所有するコントロールは、フォームが破棄されるときに破棄されます。つまり、Dispose()を呼び出すと、コントロールはそのすべての子に対してDispose()を呼び出します。フォームを非表示にしてもDispose()は呼び出されませんが、ほとんどの場合、ダイアログを作成して必要に応じて破棄するだけで問題ありません。

これは、デザイナーが生成したフォームとコントロールの場合に常に当てはまります。コードでNotifyIconなどの非ビジュアルコンポーネントを作成する場合(所有者を設定せずに)、手動で破棄する必要があります。ただし、通常は所有者を適切に設定する方が簡単です。

IDisposableを実装するクラスは、コレクションまたはプロパティに関係なく、子に対してDispose()を呼び出す必要があります。正当な理由がない限り(つまり、呼び出し元がオブジェクトの所有者のままである場合がありますが、それがまさに所有権を設定する概念の目的です)。

他のヒント

1つのオプションは、アセンブリに対してFxCopを実行することです。そのルールの1つは、IDisposableを実装するすべてのオブジェクトでDisposeが呼び出されていることを確認し、違反がある場合は警告します。

編集:後の質問に答えるために、Disposeは自動的に呼び出されません。それを自分で処理する必要があります。この件に関する 1つの記事があります。

is演算子を使用して、オブジェクトがIDisposableを実装していることを確認できます。

if(object is IDisposable) {
    ((IDisposable)object).Dispose();
}

Xを押して modal フォームを閉じると、フォームは実際には非表示になります。リソースを解放するには、disposeを手動で呼び出す必要があります。
こちらをご覧ください: http://msdn.microsoft .com / en-us / library / system.windows.forms.form.dialogresult.aspx

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top