2

例えば、

int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);

using ブロックはなく、using ブロックを使用する明確な方法も、Dispose() を呼び出す明確な方法もありません。もちろん、UnmanagedResourceUsingMemorySuckingPig は IDisposable を実装しています。

4

4 に答える 4

9

そのクラスのファイナライザーが を呼び出すDispose()場合、はい。そうでない場合は、いいえ。

(編集)追加情報:

Dispose が呼び出されると想定しないでください。Dispose が呼び出されない場合は、型が所有するアンマネージ リソースも Finalize メソッドで解放する必要があります。

編集

Dispose()上記の編集を明確にするために、多くの人が (このスレッド、SO、および他の場所で) 「オブジェクトが削除されると GC が呼び出される」と主張しているのを見てきました。これはまったく当てはまりません。はい、コンポーネントを作成する優れた防御的なコーダーは、それDispose()が明示的に呼び出されないと想定し、ファイナライザーで呼び出します。ただし、コンポーネントを使用する優れた防御的なコーダーは、ファイナライザーが を呼び出さないと想定する必要がありますDispose()ガベージ コレクターでの自動呼び出しはありませんDispose()。この機能は、ファイナライザーが を呼び出す場合にのみ有効Dispose()です。

于 2009-04-29T17:21:31.920 に答える
3

私はそうは思いません。あなたは書く必要があります:

 using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig()) 
{
  myResult= urumsp.GetThingsDone(id);
}
于 2009-04-29T17:22:03.340 に答える
1

ファイナライザー (デストラクタ) がある場合にのみ、それが呼び出されることを確認できます。ファイナライザーは呼び出すことができますDispose()が、通常の実装はファイナライザーとDispose()callの両方protected Dispose(bool)です。

言い換えれば、 の実装に依存しUnmanagedResourceUsingMemorySuckingPigます。ガイドラインに従えば、無名オブジェクトはクリーンアップされますが、usingブロックほど効率的ではありません。

于 2009-04-29T18:23:10.913 に答える
0

いいえ。ただし、GC は最終的にオブジェクトを収集し、ファイナライズ可能であることを認識し (ファイナライズ可能ですよね?)、ファイナライズします。Dispose は、決定論的にリソースをクリーンアップするためのものです。

于 2009-04-29T17:22:24.617 に答える