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;
}
}
}
●アンマネージリソース
基本はC#/.NET Frameworkの外の世界のオブジェクトです。
例えば、APIで呼び出した呼び出したものとか
こちらの説明が参考になると思います。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1233382...
一般的には、アンマネージドリソースって何という質問は意味をなしません。というよりも、アンマネージドという言葉自体が、.NET Frameworkから見て管理外のリソースという意味しかありません。つまり、.NET Frameworkからは管理の仕方がわからないリソースのことを総称してそう呼んでいるだけです。
極端なことを言えば、あなたの作ったクラスのインスタンスが削除されるタイミングで、テレビの電源が切れないといけないという仕様にしたなら、テレビの電源はアンマネージドリソースとなるでしょう(少なくとも.NET Frameworkにはテレビの電源の切り方というのは管理外ですよね?)し、その場合、アンマネージドリソースの電源を切るコードを足す必要があるでしょう。
espresso3389さん、回答ありごとうございます。
やっとわかりました。
ということは、自分で実装したクラスのDisposeで、if(disposing)の"外側"に解放コードを書くことは、あまりなさそうですね。ほとんどの場合は、if(disposing)の"内側"で、マネージリソースのDisposeを明示的に呼び出してあげると。
なるほど。Marshal.Freeとか、GCHandleがアンマネージリソースに該当すると。あとは、見分ける方法がわかればいいのですが。Freeというメソッドがあるとアンマネージリソースであることが確実なのでしょうか? ドキュメントに明記されてるとか、見分けるための何か約束ごとがあるのでしょうか?