質問

たとえば、

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は最終的にオブジェクトを収集し、オブジェクトがファイナライズ可能であることに気付きます(ファイナライズ可能ですよね?)。破棄は、リソースを確定的にクリーンアップするためのものです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top