3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net)自作クラスに終了処理を実装する

ファイル操作を行う自作クラスでインスタンスを利用し終わった後にリソース解放の終了処理をしたいと思っています。

C++ のときはデストラクタに終了処理を書けばよかったんですが、.Net Framework の場合はその方法は使わない方がいいようです。

(ガーベージコレクションでいつ解放されるかわからないので....)

で、自作クラスに終了処理を実装にするには IDisposable インターフェイスを実装して、そこに終了処理を書けばいいようです。

こんな感じです。(C#)

public class TestClass : IDisposable {

public TestClass() {

//コンストラクタ

}

 

public void Dispose() {

// 終了処理

}

}

このクラスを呼び出して使う側でもいくつか手順が必要なようです。

一つは finally で Dispose メソッドを呼び出す方法です。

TestClass cls = new TestClass();

try{

// 処理

}finally{

cls.Dispose();

}

C# にはもう一つ using 句を使う方法があるようです。

(using といっても名前空間とは別物のようです。)

使い方はこんな感じです。

using (TestClass cls = new TestClass()) {

// 処理

}

finally を明示的に書かなくて済むので解放忘れは防げそうですね。

今まで using 句はほとんど使ってこなかったでこれからは使っていこうかと思います。

ただ個人的には、インデントがついてしまうのが気になります。。

補足ですが、Disposeメソッドと共に終了処理として Close メソッドを実装しているクラスがいくつかありますよね。(Connection 系や IO Stream 系)

これらのクラスを Open メソッドで使った時は明示的 finally 句で Close してやらないといけないようです。

つまり、using だけではダメということです。

結局こうなります。

using (StreamReader rd = new StreamReader(@"C:\Hoge.txt", System.Text.Encoding.Default)) {

try {

//処理...

} finally {

// rd を閉じる

if (rd != null) {

rd.Close();

}

}

}

参考:

MSDN:Dispose メソッドの実装

@IT:.NET TIPS 確実な終了処理を行うには? - C#

C# の using ステートメントによる Dispose()

IDisposableとDispose - はらぐろブログラマン

C# オブジェクトの破棄を保証する