この記事を開始する前に、それはいくつかの準備の知識が必要です。まず、「何がリソースである。」を提唱 CLRが出てきた後に、Windowsシステムリソースは、「アンマネージリソース」に始まり、「リソースを管理していました。」
アンマネージリソースの意味:すべてのウィンドウカーネルオブジェクト(ハンドル)は、これらのリソースはCLRによってなど、ストリーム、データベース接続、GDI +に関連するオブジェクトと同様に、COMオブジェクト、用としてアンマネージリソース、管理されていないされています。
管理リソースを意味しますCLRによって割り当てとリソースの解放を管理し、それはCLRオブジェクトによって新しいです。
第二に、再びリソースが解放されているかという観点インチ
アンマネージリソース:明示的に解放する必要が、あなたは解放されたコードを記述する必要があります。
管理対象リソース:明示的に解放する必要がありますが、参照型自体は、アンマネージリソースが含まれている場合、あなたは現実的なリリースである必要はありません。
これらの2つの方法の違い、閉じると処分
オブジェクトの上にCloseメソッドを呼び出した後、オブジェクトを再利用する可能性がある、とDisposeメソッド、オブジェクトのシェアは、いくつかのリソースが役に立たないとしてラベル付けする必要があり、それは、オブジェクトが破壊されると使用できなくなり、あります。オブジェクトがこのなしで完全であるとき例えば、一般的な.NETクラスライブラリのSqlConnectionクラス、終了したときに、それがオープンを通じて再び開くことができるデータベース接続Closeメソッドを呼び出して、あなたはこのオブジェクトをマークするためにDisposeメソッドを呼び出すことができGCの回復を待って、役に立たないです。
第二に、図の3の違い。
デストラクタ | メソッドを処分 | Closeメソッド | |
意味 | オブジェクトを破壊します | オブジェクトを破壊します | 閉じるオブジェクトエクスプローラ |
呼ばれます | コールは回復はGCで呼び出され、表示することができません | あなたは、コールを表示したり、文を使用してする必要があります | これは、呼び出しを表示する必要があります |
コールのタイミング | 不確実 | 、決定ディスプレイを使用して、またはコールブロックを残します | OK、呼び出しを表示するとき |
第三に、デストラクタと説明を処分
- IDisposableインターフェイスを実装する必要性を処分してください。
- コードの開発者によって呼び出さ処分、デストラクタは自動的にGCによって呼び出されます。
- この方法は、すべての管理対象とアンマネージリソースを解放しなければならない廃棄してください。デストラクタだけアンマネージリソースを解放する必要があります。GCからのデストラクタは、オブジェクトがもはやそのデストラクタ・メソッドが呼び出されたときにGC必要とされているかどうかを判断しない、コールを決定するので、この時点でのオブジェクトは、他の有用な管理対象リソースが含まれていてもよいです。
- タグ付けするDisposeメソッドの終わりに「GC.SuppressFinalize(この);」、すなわち、あなたはGCメソッドを伝える必要がありませんが、オブジェクトがもはや有用です後にそれ以外の場合は、決意は、そのデストラクタメソッドをGCません、オブジェクトのデストラクタを呼び出しますプログラムは間違って行くが、システムのパフォーマンスに影響をすることはできませんが。
- デストラクタリリースリソースを配置しても、ユーザークラスが存在しない場合に廃棄を呼び出して、リソースがファイナライズにリリースされるように、同じである必要があります。
- ファイナライズは、公開すべきではありません。
- 頻繁にデストラクタメソッドのGCシステムリソースを呼び出すことにより、リリース、システムのパフォーマンスが低下する可能性があり、Disposeメソッドを呼び出して表示することをお勧めします。
- ある場合はこの方法を処分ファイナライズは通常、非常に低速なリソースを解放するので、それは、呼び出す必要があります。
Close関数を述べます
あなたはまた、Closeメソッドを表しせることができ、そのクローズがリソースを解放する必要はありません、この方法は、異なるクラスで異なる意味を持って閉じて、そして何の要件を閉じるには特別な意味を持ちませんがあり、「閉じました。」しかし、「オフ」の手段を閉じるために起因する、多くの場合も許可され、閉じるためにリソースを解放するために使用。例えば、閉じるオブジェクトの解放とファイル操作は、クラスを設計するときに、あなたがして処分して閉じるを呼び出し、保護処分を設定し、公衆に閉じることができ、廃棄の意味よりも正確であるように思われます。それは完全にクラス設計者が決定リソースを解放しないだろうと言うことはどういう意味閉じます。オンラインでは、この方法は非常に一方的である「閉じるコール処分」と述べました。閉じるSqlConnectionオブジェクトでは、単にデータベース接続を閉じて、SqlConnectionオブジェクトのリソースを解放しなかったことを意味します。ケースの経験によると、閉じると処分を同時に(パブリックの両方)が存在し、閉じるには、リソースの解放は、通常ので、クラスの設計者は、2つのパブリックリソースを解放するために、同じ方法を使用してはならないという意味ではありません。
V.デストラクタ及び実施例の方法を配置
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
パブリッククラスBaseResource 1:IDisposableを 2 ... { 3〜BaseResource() 4 ... { 5 //ここにいないアンマネージリソース解放するコードを記述するために、コードの可読性と保守性を維持するために 6 //デストラクタを呼び出すときに関数はガベージコレクタから呼び出される(廃棄ブール値)虚偽の処分に伝えるために呼ばれるのDispose(false)のモードでなければならない 7のDispose(false)を;。 。8} 。9は、//クライアントを直接呼び出すことはできません 10 //処分がtrueの場合、このメソッドは、ホスティング、顧客に直接と呼ばれ、アンマネージリソースを解放することができ ファイナライズを呼び出すときに処分がfalseの場合、関数はガベージコレクタから呼び出される// 11アンマネージリソースだけを解放するように、この時点で、他の管理対象オブジェクトを参照するべきではない 処分(廃棄BOOL)12保護された仮想空間を 13 ... { 14 //このメソッドは、ホスティング、その後、クライアントに直接呼び出され、非されます管理対象リソースを解放することができる 15 IF(処分) 16 ... { 17リリース管理対象リソース//。 18 OtherManagedObject.Dispose(); } 19 20 //アンマネージリソースを解放します 21()DoUnManagedObjectDispose; 22 //このメソッドは、クライアントに直接呼び出され、それによって、ガベージコレクタを防止し、ファイナライズキューから身をクリアするためにガベージコレクタを伝えるデストラクタメソッドを呼び出します。 23のIF(処分) 24 GC.SuppressFinalize(この); 25} 26 //直接呼び出すことができ、顧客は、 廃棄()27公共のボイド 28が... { 29 //(真)を配置BOOL(真の廃棄を指示する方法)機能を配置して呼び出す必要がありますが、お客様に直接呼ばれます (真の)廃棄30; 31である} 32}
参考:
管理対象リソース:CLRはそれはCLRオブジェクトによって新しいもので、割り当てとリソースの解放を管理します。
アンマネージリソース:CLRオブジェクトによって管理されていない、そのようなので、上のファイル、データベース接続、ソケット、COMオブジェクト、およびなどのWindowsカーネルオブジェクト、;