2009-04-29 2 views
2

匿名変数には処分されますか?例えば、全く使用してブロックを用いてブロックを使用する明らかな方法、廃棄する(呼び出すための明らかな方法は)

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

ありません。もちろん、UnmanagedResourceUsingMemorySuckingPigはIDisposableを実装しています。

+0

質問:UnmanagedResourceUsingMemorySuckingPigは、IDisposeがアンマネージドの場合、どのように実装できますか? –

+0

GetThingsDone()は「邪悪な行為者」の一例だと思われますが、私はそれを取り除くための再設計を提案します。 cf. http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html –

+1

@Dave:名前を慎重に読むと、管理されていないリソースが使用されます。管理されていない。 –

答えて

9

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

(編集)だけでいくつかadditional info

は廃棄が と呼ばれることを前提としないでください。 タイプが所有する管理されていないリソースも、 Disposeが呼び出されない場合は、 Finalizeメソッドで解放する必要があります。 (他の場所でこのスレッドでは、SOに、と)

編集

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

+1

アダムロビンソン、私はあなたが編集に同意したいと思う:) –

+0

@ブルノ:ありがとう!私は運転していたが、他の人が回答を投稿していたので、GCが自動的にDispose()を呼び出すというこの神話を暴くのは大いに感謝している。 –

+0

FinalizerがDisposeを明示的に呼び出す必要があるのは間違いありませんが、Disposeを呼び出さないFinalizerを持つDisposableクラスは見たことがありません。私は、コンポーネントのユーザーが、ファイナライザがDisposeを呼び出さないと仮定する必要はないと考えています。これはコンポーネントがバグだと仮定することと同じです。それにもかかわらず、DisposableコンポーネントのユーザーはDispose(通常はusingステートメントを使用して)を呼び出す必要があります。 – Joe

3

私はそう信じません。あなたは記述する必要があります:

using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig()) 
{ 
    myResult= urumsp.GetThingsDone(id); 
} 
0

号しかし、GCは、最終的にオブジェクトを収集し、それは(それが正しい、ファイナライズ可能である?)ファイナライズ可能であり、あなたのためにそれを最終決定することに気づくでしょう。 Disposeは、リソースを確定的にクリーンアップするためのものです。

+0

大抵はいですが、これは遅すぎる可能性があります(たとえば、GCが収集する前にアンマネージドリソースを使用したい場合など)。 http://msdn.microsoft.com/en-us/library/system.directoryservices.searchresultcollection.aspx "実装の制限により、SearchResultCollectionクラスは、ガベージコレクションされたときにアンマネージリソースをすべて解放できません。" – Joe

+1

これは間違っています他の答えと同じように。 GCにdisposeを呼び出す機能はありません。ファイナライザがそうする場合(明示的にコーディングする必要がある)、これは真です。ファイナライザが(あなたがそれを知らせなければ)終わらないならば、これは真実ではありません。 –

+0

@Adam:私はDisposeというGCを言っていませんでした。私はそれがオブジェクトを完成させたと言いました。 –

1

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

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

関連する問題