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;
}
}
}

回答の条件
  • 1人5回まで
  • 登録:2010/01/28 22:33:27
  • 終了:2010/02/04 22:35:02

回答(2件)

id:heke2mee No.1

heke2mee回答回数162ベストアンサー獲得回数432010/01/29 01:29:23

ポイント35pt

●アンマネージリソース

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

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


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

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

id:wataradio

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

2010/01/29 09:40:07
id:espresso3389 No.2

espresso3389回答回数35ベストアンサー獲得回数62010/01/31 00:52:15

ポイント35pt

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

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

id:wataradio

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

やっとわかりました。

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

2010/01/31 09:00:53

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません