MSDN's example pattern廃棄()メソッドを実装するためにはヌルに配置された管理対象リソース(_resource = null
)への参照を設定示すが、if (disposing)
ブロックの外側そう:MSDN Dispose()の例で誤りがありますか? (nullに管理対象の参照を設定する場合)
protected virtual void Dispose(bool disposing)
{
// If you need thread safety, use a lock around these
// operations, as well as in your methods that use the resource.
if (!_disposed)
{
if (disposing) {
if (_resource != null)
_resource.Dispose();
Console.WriteLine("Object disposed.");
}
// Indicate that the instance has been disposed.
_resource = null;
_disposed = true;
}
}
Shouldn '_resource = null
はこのコードブロックの中に置かれますか? Dispose(false)
への電話が行われた場合、_resource
はヌルになり、その後処分できなくなります。 ??
もちろん、Dispose(false)
は、ファイナライズ中にランタイムによって(実際には)呼び出されるだけです。しかし、_resource
が以前に処分されていなかった場合、オブジェクト(_resource
のメンバーフィールドを含む)がガベージコレクションされる直前に、この時点でnullに設定する必要はありますか?
ずっと読みになった後、それがnullへの参照が必要でない設定に表示されますが、「重い」メンバーのために良いアイデアかもしれ:
[元の質問の終わり]
フォローアップあなたが含まれているクラス(処分されているクラス)がすぐにガベージコレクションされないかもしれないと信じる理由がある場合、オブジェクト。
オブジェクトの廃棄は、コードを消費してオブジェクトが「解放」されたことを保証していないことを理解してください。廃棄されたオブジェクトは、さまざまな目的のために、または間違って(コレクションなどで)保持されることがあります。コレクションのオブジェクトを使用して破棄するアプリケーションを想像することはできますが、後で削除を実行して最終状態を記録するためのコレクションにコレクションを保管しておいてください...
結論:
- 「重い」メンバーオブジェクトへの参照を設定するには、解放それらに配置されたオブジェクトが解放されていない場合でも、ガベージコレクションの をゼロにします。
- すべてのオブジェクトの参照をクリアするのは大変です。
- したがって、
_resource = null
ステートメント(元の質問)の配置は、次の2つの理由から重要ではありません。(A)これを使用することは、上記を読んだ後に考えることに過ぎません。 (B)MSDNの例では、Dispose(true)
とDispose(false)
の両方で実行されますが、後者はオブジェクトがファイナライズされていて、とにかくガベージコレクションが行われるだけです。
このように、私の好みは、最も内側のif
ブロック内_resource = null
を置くことになります。これは、一緒にすべての_resource
コードを保持します
if (disposing) {
if (_resource != null) {
_resource.Dispose();
_resource = null;
}
}
。さらなる考え、誰ですか?
もっと読み:
- In the Dispose(bool) method implementation, Shouldn't one set members to null?
- Do you need to dispose of objects and set them to null?
- http://www.codeproject.com/KB/dotnet/idisposable.aspx(非常に良い、と長いです!)
ほとんど目的を果たしていませんが、ほとんど害はありません...実際には、私は 'Console'への書き込みと、' Console'への書き込みは、すでに処分されていても、それを処分しないでください( 'if'に欠けている中カッコを見てください)。 –
ハハ! 'Console.Writeline()'はサンプルコードです。 Trace.Writeline()あなたはよかったですか?また、不足しているブレースはありません。これは 'if'行の最後にあります(StyleCopに準拠していません)。 –
再度見てください。それは "Object disposed"と書いています。 '_resource'がnullだったとしても' .Dispose() 'は呼び出されませんでした。私は*最も内側の* ifを意味します。 –