人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C#でマネージドリソースと、アンマネージドリソースの見分け方を教えてください。

C#ではIDisposableインタフェースの実装パターンとして、以下のようなものが
提示されていますが、"アン"マネージドリソースとして解放すべきものがなんなのかよくわかりません。

StreamReaderだとかは、マネージドリソースなのでif(disposing)の中で解放するんですよね?
"アン"マネージドリソースって具体的にどんなものがあるのですか?
また何かマネージドリソースと区別できる目印がありますか?

class A : IDisposable
{
private bool isDisposed = false;

~A()
{
this.Dispose(false);
}

public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}

public Dispose(bool disposing)
{
if (!this.isDisposed)
{
if (disposing)
{
// マネージドリソースの解放
// 例えば、StreamReader、SQLiteConnection
}
// アンマネージドリソースの解放
// ここで解放すべきアンマネージドリソースって具体的に何?

this.isDisposed = true;
}
}
}


●質問者: wataradio
●カテゴリ:コンピュータ
✍キーワード:C# Class GC StreamReader void
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● heke2mee
●35ポイント

●アンマネージリソース

基本はC#/.NET Frameworkの外の世界のオブジェクトです。

例えば、APIで呼び出した呼び出したものとか


こちらの説明が参考になると思います。

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1233382...

◎質問者からの返答

なるほど。Marshal.Freeとか、GCHandleがアンマネージリソースに該当すると。あとは、見分ける方法がわかればいいのですが。Freeというメソッドがあるとアンマネージリソースであることが確実なのでしょうか? ドキュメントに明記されてるとか、見分けるための何か約束ごとがあるのでしょうか?


2 ● espresso3389
●35ポイント

一般的には、アンマネージドリソースって何という質問は意味をなしません。というよりも、アンマネージドという言葉自体が、.NET Frameworkから見て管理外のリソースという意味しかありません。つまり、.NET Frameworkからは管理の仕方がわからないリソースのことを総称してそう呼んでいるだけです。

極端なことを言えば、あなたの作ったクラスのインスタンスが削除されるタイミングで、テレビの電源が切れないといけないという仕様にしたなら、テレビの電源はアンマネージドリソースとなるでしょう(少なくとも.NET Frameworkにはテレビの電源の切り方というのは管理外ですよね?)し、その場合、アンマネージドリソースの電源を切るコードを足す必要があるでしょう。

◎質問者からの返答

espresso3389さん、回答ありごとうございます。

やっとわかりました。

ということは、自分で実装したクラスのDisposeで、if(disposing)の"外側"に解放コードを書くことは、あまりなさそうですね。ほとんどの場合は、if(disposing)の"内側"で、マネージリソースのDisposeを明示的に呼び出してあげると。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ