2006年12月19日

IDisposable を実装している型からの継承

  
C#で、IDisposable を実装する型から継承している型で何らかのリソースを解放しなければならない場合は、以下のようなコードを書きます。

public class DelivedType : DisposableType  {
private bool disposed;
protected override void Dispose(bool disposing) {
try {
if ( !this.disposed ) {
if ( disposing ) {
// ここでマネージドリソースのリリース処理
}
// ここで、アンマネージドリソースのリリース処理
}
disposed = true;
} finally {
base.Dispose(disposing);
}
}
}

try-finally で、確実に base.Dispose(disposing); を呼び出すのがポイント。
なお、この派生した型では、Dispose() や、Finalize() の実装は不要です。


この記事へのコメント
引数付きは IComponent.Dispose ですね。
Posted by 菊池 at 2006年12月20日 23:23
すみません。おっしゃっている意味がよく理解できません。
できましたらもう少し詳しくお願いします。
Posted by Gushwell at 2006年12月20日 23:52
IComponent.Dispose(bool) じゃなくて、Component.Dispose(bool) でしょ?>kasuk
要するに、「IDisposable 派生クラス」が void Dispose(bool) を実装している保証は無くて、それが保証されるのは Component 派生の場合だけ、ということです。

Posted by 渋木宏明(ひどり) at 2006年12月21日 13:12
ああ、確かにそうですね。
MSが推奨しているDisposeパターン(イディオム?)を使っていることを前提に書いてしまいました。
Dispose(bool)が保証されているのは、Componentの派生クラスだけなので、僕のコードは、すべての場合に適用できないですね。


Posted by Gushwell at 2006年12月21日 16:03
もちろん、Component 派生でなくても、ヘルプの「Dispose() メソッドの実装」で示されているデザインパターンに従うのは賛成です。
Posted by 渋木宏明(ひどり) at 2006年12月22日 11:09
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/50668236