【C#】using+IDisposableのように一応使える、try-finally
例えば、下記のようなファイルを読み込む処理の場合。
using (var fs = new FileStream("example.txt", FileMode.Open)) using (var rs = new StreamReader(fs)) { string line; while ((line = rs.ReadLine()) != null) { Console.WriteLine(line); } }
usingブロックを抜けた際、IDisposableインターフェースのメソッドDisposeが実行され、オブジェクトの破棄が実施されます。
usingブロックを使わずに(またはIDisposableを継承していないクラスに)、上記挙動を実現するのにtry-finallyが使用できます。
FileStream fs = null; StreamReader rs = null; try { fs = new FileStream("example.txt", FileMode.Open); rs = new StreamReader(fs); string line; while ((line = rs.ReadLine()) != null) { Console.WriteLine(line); } } finally { //nullチェックをせずに実行すると、fsかrsがnullの場合、tryでスローした例外がNullReferenceExceptionに上書きされてしまう fs?.Dispose(); rs?.Dispose(); }
しかしまあ冗長ですし、nullチェックもいりますし… using-IDisopsableはC#の初めのころから(少なくとも2.0から)あり歴史も古いので、基本的にはusingが使われていると思われます。