無名変数に対してdisposeが呼び出されますか?
-
03-07-2019 - |
質問
たとえば、
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
usingブロック、usingブロックを使用する明白な方法、Dispose()を呼び出す明白な方法はありません。そしてもちろん、UnmanagedResourceUsingMemorySuckingPigはIDisposableを実装します。
解決
そのクラスのファイナライザが Dispose()
を呼び出す場合、はい。そうでない場合、いいえ。
(編集)一部の追加情報:
Disposeが と呼ばれます。が所有する管理されていないリソース タイプは、 イベントでメソッドをファイナライズ Disposeは呼び出されません。
編集
上記の編集を明確にするために、(このスレッド、SO、およびその他の場所で)多くの人々が、「オブジェクトが削除されるとGCが Dispose()
を呼び出す」と主張しているのを見てきました。 ;これはまったく当てはまりません。はい、コンポーネントを記述する優れた防御コーダーは、 Dispose()
が明示的に呼び出されず、ファイナライザーで呼び出されることを前提としています。ただし、コンポーネントを使用する優れた防御コーダーは、ファイナライザーが Dispose()
を呼び出さないと想定する必要があります。 ガベージコレクターでの Dispose()
の自動呼び出しはありません。この機能は、ファイナライザが Dispose()
を呼び出す場合にのみ有効です。
他のヒント
私はそうは思わない。書く必要があります:
using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig())
{
myResult= urumsp.GetThingsDone(id);
}
ファイナライザ(デストラクタ)がある場合にのみ呼び出されることを確認できます。
ファイナライザは Dispose()
を呼び出すことができますが、通常の実装では、ファイナライザと Dispose()
の両方が protected Dispose(bool)
を呼び出します。
言い換えれば、それは UnmanagedResourceUsingMemorySuckingPig
の実装に依存します。ガイドラインに従う場合、匿名オブジェクトはクリーンアップされますが、 using
ブロック。
いいえ。ただし、GCは最終的にオブジェクトを収集し、オブジェクトがファイナライズ可能であることに気付きます(ファイナライズ可能ですよね?)。破棄は、リソースを確定的にクリーンアップするためのものです。