.NETの「管理対象」リソースと「非管理対象」リソースの意味は何ですか?


回答:


80

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

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

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

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


19
少し明確にしておきます。「アンマネージリソース」は、ガベージコレクターが破棄された後、クリーンアップする方法を知らないものです。たとえば、存続期間の長いオブジェクトからのイベントへの存続期間の短いオブジェクトのサブスクリプションは、GCがそのサブスクリプションを認識できないため、両方のオブジェクトがガベージコレクターの制御下にあっても、アンマネージリソースになります。サブスクライバーは放棄されたが、パブリッシャーは放棄された場合は廃棄する必要があります。パブリッシャの存続期間中に無制限の数のサブスクライバが作成および破棄される可能性がある場合、メモリリークが発生します。
スーパーキャット2011

12
もう少し明確化を追加します。SqlConnection(またはFileStreamなど)は、GCが認識しないアンマネージリソースを内部的に使用するマネージリソースです。
jimvfr 2013年

2
jimvfrは正解です。SqlConnectionは管理対象リソースの例です。アンマネージリソースの例は、メソッドMarshal.AllocHGlobal()を使用してアンマネージメモリからメモリを割り当てる必要がある場合です。これはアンマネージリソースであり、この場合のベストプラクティスは、デストラクタ(〜ctor)を使用してMarshal.FreeHGlobal()を呼び出すことです。このメモリを解放します。
イゴールトマズ2014

マネージリソースとアンマネージリソースの両方の例を挙げていただけますか。
Radha Manohar、

32

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

アンマネージリソースとは、そうではないリソースです。ファイルハンドル、固定メモリ、COMオブジェクト、データベース接続など。


13

Q&Aでアンマネージリソースとは何ですか?1ブルースウッドは以下を投稿しました:

「管理されている」と「管理されていない」という用語を次のように考えます。

「管理対象」とは、.NETサンドボックス内のすべてのものを指します。これには、すべての.NET Frameworkクラスが含まれます。

「管理されていない」とは、.NETサンドボックスの外の荒野を指します。これには、Win32 API関数の呼び出しを通じて返されるすべてが含まれます。

あなたがいる場合決して Win32 API関数を呼び出すことなく、決して任意のWin32の「ハンドル」オブジェクトを取り戻す、あなたはどのアンマネージリソースを保持していません。.NET Frameworkクラスのメソッドを介して開くファイルとストリームは、すべてマネージラッパーです。

コメント:アンマネージリソースを直接保持していない可能性があります。ただし、System.IO.FileStreamなどの管理された「ラッパークラス」を介して間接的に管理されていないリソースを保持している可能性があります。このようなラッパークラスは、通常、IDisposableを(直接または継承を介して)実装します。

...多くのマネージド(.NET Framework)オブジェクトはアンマネージリソースを内部に保持しているので、できるだけ早くそれらをDispose()するか、少なくとも呼び出し元にそうする機会を提供する必要があります。そこで、独自のDispose()メソッドを作成します。基本的に、IDisposable()を実装すると、次の2つの処理が行われます。

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

  2. あなたとあなたの呼び出し元が、あなた/あなたの呼び出し元が解放したいと思うそれらの汚い小さな手に貴重なリソースを保持している重い.NETオブジェクト/ .NETオブジェクトを解放することを可能にします。

コメント:メソッドIDisposableを実装して提供することDispose()で、クラスのユーザーが、クラスのインスタンスによって保持されているアンマネージリソースを確定的な方法で解放できるようになります。


1 Sachin Shanbhagの回答で最初に共有されたリンク。2005年11月17日付けの引用資料。引用されたコンテンツを軽くコピー編集したことに注意してください。


5

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

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


1
「IDisposableインターフェイスの背後にあるアイデアは、確定的な方法でリソースをクリーンアップし、アンマネージリソースをクリーンアップできるようにすることです。」
zionpi 2013年

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.