例えば、
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
using ブロックはなく、using ブロックを使用する明確な方法も、Dispose() を呼び出す明確な方法もありません。もちろん、UnmanagedResourceUsingMemorySuckingPig は IDisposable を実装しています。
例えば、
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
using ブロックはなく、using ブロックを使用する明確な方法も、Dispose() を呼び出す明確な方法もありません。もちろん、UnmanagedResourceUsingMemorySuckingPig は IDisposable を実装しています。
そのクラスのファイナライザーが を呼び出すDispose()
場合、はい。そうでない場合は、いいえ。
(編集)追加情報:
Dispose が呼び出されると想定しないでください。Dispose が呼び出されない場合は、型が所有するアンマネージ リソースも Finalize メソッドで解放する必要があります。
編集
Dispose()
上記の編集を明確にするために、多くの人が (このスレッド、SO、および他の場所で) 「オブジェクトが削除されると GC が呼び出される」と主張しているのを見てきました。これはまったく当てはまりません。はい、コンポーネントを作成する優れた防御的なコーダーは、それDispose()
が明示的に呼び出されないと想定し、ファイナライザーで呼び出します。ただし、コンポーネントを使用する優れた防御的なコーダーは、ファイナライザーが を呼び出さないと想定する必要がありますDispose()
。ガベージ コレクターでの自動呼び出しはありませんDispose()
。この機能は、ファイナライザーが を呼び出す場合にのみ有効Dispose()
です。
私はそうは思いません。あなたは書く必要があります:
using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig())
{
myResult= urumsp.GetThingsDone(id);
}
ファイナライザー (デストラクタ) がある場合にのみ、それが呼び出されることを確認できます。ファイナライザーは呼び出すことができますDispose()
が、通常の実装はファイナライザーとDispose()
callの両方protected Dispose(bool)
です。
言い換えれば、 の実装に依存しUnmanagedResourceUsingMemorySuckingPig
ます。ガイドラインに従えば、無名オブジェクトはクリーンアップされますが、using
ブロックほど効率的ではありません。
いいえ。ただし、GC は最終的にオブジェクトを収集し、ファイナライズ可能であることを認識し (ファイナライズ可能ですよね?)、ファイナライズします。Dispose は、決定論的にリソースをクリーンアップするためのものです。