2016-06-01 7 views
0

私はこれらの記事をDispose PatternDispose Implementationで読んでいます。私の質問は、ファイナライザからvirtual dispose(bool)メソッドを呼び出すとき、なぜメソッドにfalseを渡してアンマネージリソースを解放するだけなのか?私たちが真実を伝えれば、何が壊れますか?パターン使用を廃棄する

がまたしても、我々はIDisposbleインタフェースを実装している、それはまだブロックを使用して内のコードをラップするかまたは呼び出されるのDispose()メソッドのために、明示的に()のDisposeを呼び出すために、開発者に依存しています。開発者が十分注意していない場合、IDisposbleインターフェースのアドオンは何ですか?

答えて

1

あなたの最初のリンクから:

Booleanパラメータの処分は、法が IDisposable.Disposeの実装からか ファイナライザから呼び出されたかどうかを示します。 Dispose(bool)実装では、他の参照オブジェクトにアクセスする前にパラメータ をチェックする必要があります(先のサンプル のリソースフィールドなど)。このようなオブジェクトは、 メソッドがIDisposable.Dispose実装から呼び出されたとき( のdisposingパラメータがtrueの場合)にのみアクセスする必要があります。メソッドが ファイナライザから呼び出された場合(廃棄はfalse)、他のオブジェクトには がアクセスされるべきではありません。 その理由は、オブジェクトが予測不可能な の順序でファイナライズされているため、オブジェクトまたはその依存関係のいずれかで既に がファイナライズされている可能性があるからです。

希望します。

+0

しかし、2番目のリンクは、イベントがフックされているなど、条件が真であるときに管理対象のソースのリリースを実装します。その場合、ファイナライザがメソッドをdisposeしてfalseを渡すと、イベントはunhookされず、メモリリークが発生します。そうではありませんか? – Helic

+0

Disposeパターンは単なるガイドラインです。誰か他の人が正当な理由を持っているかもしれませんが、個人的にはDisposeのMSガイドラインに従います。 –

関連する問題