2009-07-10 20 views
6

Dispose patternについては、「を管理して管理していないコードをクリーンアップする」を繰り返し参照しています。また、Disposeメソッドの標準的な実装では、管理対象オブジェクトのクリーンアップとアンマネージオブジェクト専用の特定のフロー(disposingが真または偽であるかどうかによって異なります)が表示されます。廃棄パターン:管理対象と管理対象を知る方法を教えてください。

しかし、初心者である私は、どのタイプが管理されており、どのタイプが管理されていないのかを知ることはできますか?

答えて

3

ショートバージョンは、DisposeメソッドでもIDisposableを実装するものが必要です。 FxCopは、あなたが何かを見逃しているかどうかを教えてくれるでしょう。そうしなければならないときには、全くIDisposableを使っていません。

+0

これは本当に質問に答えることはできませんが、私はもはや良い答えが存在するとは確信していません。これは、プログラマが型の "管理"について判断できないときに発生する問題に対して最高の実用的な解決策を提供しますが、私はその判断をするための決定的なヒューリスティックを望むプログラマは、 –

0

わからない場合は、おそらく使用しているタイプが管理されている可能性があります。

アンマネージドタイプとは、安全でないタイプ、つまりCLRの安全要件に準拠していないタイプを指します。

Great definition linked

更新

私はdownvoteを理解していませんか?問題は具体的には管理型と非管理型を区別する方法でした。

他のすべての回答は、管理された/管理されていない質問ではなく、IDisposeの質問に対処していました。

アップデート2

二downvoteのまだ説明...

私はIDisposableオブジェクトが常に配置されるべきで、それが非管理対管理についての質問に答えていない、同意。

+0

他のコメントと同様に、CLRの安全要件に準拠していないタイプがあることをどのように知っていますか?私。選択したタイプの「管理されていない」ことを報告するReflectorプラグインを作成する場合、プラグインはそのタイプを調べて決定的な判断を下しますか? –

0

私は単純に、すべてのリソースを使用した後にすべてのリソースを破壊することを推奨します。通常は、明示的に解放したいソケットやストリームリソースなどのシステムリソースに依存するもの。疑わしい時は先に進み処分する。あなたは長期的に多くのデバッグの問題を保存します。通常、.NETで書かれていないコードを呼び出すと、それは「マネージコード」ではないとみなすことができます。

2

管理対象または管理対象外ではありません。クラスがIDisposableインターフェイスを実装している場合は、オブジェクトが終了したらDispose()を呼び出す必要があります。代わりに(好ましくは)using statementを使用して、オブジェクトが有効範囲外になったときにDispose()が自動的に呼び出されるようにします。

@ Rob:
答えはまだ同じです。あなたのクラスがIDisposableを実装する内部オブジェクトを管理している場合は、IDisposableも実装する必要があります。 Dispose()メソッドで、それらのオブジェクトに対してDisposeを呼び出します。

+0

私は、IDisposablesの設計の観点から質問をしていたと思っています。つまり、処分するか、ファイナライズするときに何をすべきか、またはすべきではありません。 – Rob

+1

@Thorarin - 私は、Robが指摘しているところは、古典的なdisposeパターンを実装すると、disposeを呼び出すか、ファイナライザが実行されたために破棄しているかを示すisDisposingフラグがあることです。後者の場合、既にガベージコレクションされている可能性のある他の管理対象オブジェクトを破棄しないように注意する必要があります。 Dispose()メソッドから明示的に呼び出された場合は、これらを破棄することが安全です。ただし、*管理されていない*リソースは、両方の場合に処分する必要があります。 –

+0

私はGestapoのアプローチの方が気になります。ファイナライザがまったく呼び出された場合、コードを修正するためにプログラマに大声で訴えます。 – Thorarin

5

アンマネージドとは、主に処理するネイティブWin32オブジェクトを意味します。生のCOMオブジェクトへの参照などがあります。これらは、.NET CLRの管理下にない(または管理されていない)リソースです。

+0

そうですが、厳密には.NETの開発者が若すぎて、Win32、COMなどを使用するにはどうしたらよいでしょうか?*リソースがCLRの制御下にない、あるいは悪化している* CLRの管理下にある? 私は、ハンドルが管理されていないと言うことを、どうやって知っていますか?おそらく経験。しかし、その経験がないと、毎回正しい方法でプログラマーを育てるのはどうですか? 私は、IDisposableインターフェイスの存在が十分ではないと主張します。あなたの平均的なプログラマーはIDisposableの言及のためにすべてのタイプのドキュメンテーションをチェックするよう教えられません。 –

+1

私は反対です。 IDisposableがある場合は、破棄します。期間。そうすれば、柔らかい若者はCOMの外傷にさらされる必要はありません。 –

関連する問題