ファイル操作を行う自作クラスでインスタンスを利用し終わった後にリソース解放の終了処理をしたいと思っています。
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();
}
}
}
参考:
@IT:.NET TIPS 確実な終了処理を行うには? - C#
C# の using ステートメントによる Dispose()