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