.NETでの管理対象リソースと管理対象外リソースという用語の意味は何ですか?彼らはどのように写真に登場しますか?
「管理されていないリソース」という用語は通常、何かを記述するために使用されますガベージコレクターの制御下に直接ではありません。たとえば、データベースサーバーへの接続を開くと、プロバイダーが完全にマネージコードで記述されていない場合、サーバー上のリソース(接続を維持するため)およびクライアントマシン上の他の非.netリソースが使用されます。
これが、データベース接続のようなものについて、次のようにコードを書くことをお勧めする理由です。
_using (var connection = new SqlConnection("connection_string_here"))
{
// Code to use connection here
}
_
これにより、.Dispose()
が接続オブジェクトで呼び出され、管理されていないリソースがクリーンアップされるようになります。
管理対象リソースは、純粋な.NETコードであり、ランタイムによって管理され、直接制御されているリソースです。
管理されていないリソースはそうではありません。ファイルハンドル、固定メモリ、COMオブジェクト、データベース接続など。
Q&Aで 管理されていないリソースとは1、ブルース・ウッドは以下を投稿しました:
「管理」および「非管理」という用語は次のように考えます。
"Managed"は、.NETサンドボックス内のすべてを指します。これには、すべての.NET Frameworkクラスが含まれます。
"Unmanaged"は、.NETサンドボックス外の荒野を指します。これには、Win32 API関数の呼び出しを通じて返されるものがすべて含まれます。
never Win32 API関数を呼び出し、never Win32の「ハンドル」オブジェクトを取得する場合、管理されていないリソースは保持されていません。 .NET Frameworkクラスメソッドを介して開くファイルとストリームは、すべてマネージラッパーです。
コメント:管理されていないリソースを保持していない可能性があります直接。ただし、管理されていないリソースを保持している可能性があります間接的にSystem.IO.FileStream などの管理された「ラッパークラス」を介して。このようなラッパークラスは、一般的に IDisposable (直接または継承経由)を実装します。
...多くのマネージド(.NET Framework)オブジェクトがアンマネージドリソースを内部に保持しているため、できるだけ早くDispose()するか、少なくとも呼び出し側にそうする機会を提供したいでしょう。そこで、独自のDispose()メソッドを作成します。基本的に、IDisposable()を実装すると、次の2つのことが行われます。
.NETの背後にあるオペレーティングシステムから直接取得したリソース(管理されていないリソース)を取り除くことができます。
あなたとあなたの呼び出し元は、あなた/あなたの呼び出し元が解放したいnowである、ごちゃごちゃした小さな手の中に貴重なリソースを保持している多額の.NETオブジェクト/.NETオブジェクトを解放できます。
コメント:IDisposable
を実装し、それによってDispose()
メソッドを提供することにより、クラスのユーザーがクラスのインスタンスによって保持されているアンマネージリソースをdeterministic形式でリリースします。
1 元々 Sachin Shanbhagの答え で共有されていたリンク。 2005-11-17日付の引用資料。引用されたコンテンツを簡単にコピー編集したことに注意してください。
マネージリソースとアンマネージリソースの基本的な違いは、ガベージコレクターがすべてのマネージリソースについて知っていることです。ある時点でGCが実行され、マネージオブジェクトに関連付けられたすべてのメモリとリソースをクリーンアップします。 GCは、ファイル、ストリーム、ハンドルなどのアンマネージリソースを認識しないため、コードで明示的にクリーンアップしないと、メモリリークやロックされたリソースが発生します。
詳細- http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources
マネージリソースは、ガベージコレクタによって解放できるリソースであり、デストラクタが必要なため、アンマネージリソースはガベージコレクタによって解放できません。