web-dev-qa-db-ja.com

.NETの「管理対象」リソースと「管理対象外」リソースとはどういう意味ですか?

.NETでの管理対象リソースと管理対象外リソースという用語の意味は何ですか?彼らはどのように写真に登場しますか?

100
Red Swan

「管理されていないリソース」という用語は通常、何かを記述するために使用されますガベージコレクターの制御下に直接ではありません。たとえば、データベースサーバーへの接続を開くと、プロバイダーが完全にマネージコードで記述されていない場合、サーバー上のリソース(接続を維持するため)およびクライアントマシン上の他の非.netリソースが使用されます。

これが、データベース接続のようなものについて、次のようにコードを書くことをお勧めする理由です。

_using (var connection = new SqlConnection("connection_string_here"))
{
    // Code to use connection here
}
_

これにより、.Dispose()が接続オブジェクトで呼び出され、管理されていないリソースがクリーンアップされるようになります。

69
Rob

管理対象リソースは、純粋な.NETコードであり、ランタイムによって管理され、直接制御されているリソースです。

管理されていないリソースはそうではありません。ファイルハンドル、固定メモリ、COMオブジェクト、データベース接続など。

30
Oded

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つのことが行われます。

  1. .NETの背後にあるオペレーティングシステムから直接取得したリソース(管理されていないリソース)を取り除くことができます。

  2. あなたとあなたの呼び出し元は、あなた/あなたの呼び出し元が解放したいnowである、ごちゃごちゃした小さな手の中に貴重なリソースを保持している多額の.NETオブジェクト/.NETオブジェクトを解放できます。

コメント:IDisposableを実装し、それによってDispose()メソッドを提供することにより、クラスのユーザーがクラスのインスタンスによって保持されているアンマネージリソースをdeterministic形式でリリースします。


1 元々 Sachin Shanbhagの答え で共有されていたリンク。 2005-11-17日付の引用資料。引用されたコンテンツを簡単にコピー編集したことに注意してください。

10
DavidRR

マネージリソースとアンマネージリソースの基本的な違いは、ガベージコレクターがすべてのマネージリソースについて知っていることです。ある時点でGCが実行され、マネージオブジェクトに関連付けられたすべてのメモリとリソースをクリーンアップします。 GCは、ファイル、ストリーム、ハンドルなどのアンマネージリソースを認識しないため、コードで明示的にクリーンアップしないと、メモリリークやロックされたリソースが発生します。

詳細- http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources

5
Sachin Shanbhag

マネージリソースは、ガベージコレクタによって解放できるリソースであり、デストラクタが必要なため、アンマネージリソースはガベージコレクタによって解放できません。

0
anil