2017-05-24 3 views
0

私はアプリケーションの終了前に廃棄を実行しますか?例えば、私の仕事で私はIDisposableインターフェイスを持つクラスを使用する必要があり、私はアプリケーションの終了前に廃棄を実行しますか?

var myObject=new MyClass(); 
myObject.OnEvent+=OnEventHandle; 

そして:

は例えば、私は多くのオブジェクトを作成し、それらのいくつかは、イベントがサブスクライブしています。 はその後、私はアプリを閉じて、これを行うことを決定:

Enviroment.Exit(-1); 

iは右ですか?

Disposeをすべてのオブジェクトに呼び出す必要がありますか?IDisposableインターフェイスを実装していますか? メモリリークが発生する可能性がありますか?

P.S.これは、WCF、MQを使用したサーバー側のアプリケーションです。

+0

ほとんどの状況で、あなたの 'IDisposable'オブジェクトはステートメントを使って折り返されるべきなので、Disposeを直接呼び出す必要はありません。 – mason

+5

一般に、 'IDisposable'を実装するすべてのクラスは、' using'ステートメントで消費されるべきです。 – Liam

+0

他の人が言っていたように、 'using'ステートメントを使ってオプションを適切に管理する必要があります。しかし、あなたの質問に答えるには:プロセスが終了すると、そのメモリはオペレーティングシステムによって解放されるので、あなた自身でオブジェクトを処分する必要はありませんが、とにかく適切に行うことをお勧めします。 – poke

答えて

3

このの具体的なの場合は、Disposeを選択しないでください。私はビルが破壊される直前にビンを空にしないというレイモンド・チェンのアナロジーを思い出したと確信していました。

プロセス全体が表示されなくなります。 はOSがすべてのリソースを再利用しようとしているため、内部リソースのクリーンアップを行う必要はありません。

ただし、あなたはこれをa)非標準的に見えるようにする必要があります。b)潜在的に警告をトリガします。 stylecop、をわずかににするのに期待される報酬と比べて、あなたは本当にアプリケーションのこの部分を最適化する必要がありますか?

他の人がコメントしたように、私は通常、この場合は厳密には不要かもしれないが、usingに自分の使い捨てオブジェクトをラップすることを選択します。


これがDLL_PROCESS_DETACHで何もしていない程度oneです。推論は似ています。

+0

Btwの 'using' _blindly_でのオブジェクトのラッピングは、いくつかのフレームワーククラス(例えば' HttpClient')でもパフォーマンスの問題を引き起こす可能性があります。残念なことに、残念ながら、この場合、クラスはあまり知られていません。 –

+1

@ Sergey.quixoticaxis.Ivanov - 合意した。しかし、「私がちょうど退出するのではないなら、私はXに「Dispose」と呼ぶべきであり、そうするべきだ」という質問の文脈をとったなら、私は答えようとしている。 –

+1

別の問題は、一部のクラスがOSが何も知らないリソースを取得する可能性があることです(例:アプリケーションは、ある通知を他のマシンに送信して、それが通知されるまで何かへの排他的アクセスを許可しました。アプリケーションが決して 'Dispose'を呼び出さなければ、削除マシンは決して資源を解放するように言われません)。 – supercat

関連する問題