[C#]Usingを使え

C#にはリソースの生成と破棄を確実に行うusingという便利な仕組みがあります。

すっごく便利です。

すっごく便利で馬鹿でも使えるので、みんな使えと言っています。例えば、以下。

-usingを使え、使えったら使え(^^)-

しかしながら、ちょっと複雑なことをやろうとすると、対応できないから文句言われたりしてます。

C#のvarとtry~catchが糞すぎる(したの方) 

それでも多くの場合は問題無いと思います。特殊な例をあげて、だからusingはダメだと言うよりは、usingを使えと声高に叫んだほうが公共の利益になると思います。(誤解無きように言っておきますと、やねうらおさんのサイトで書いてあるのはそう言う主張じゃないです)つまり、特殊な場合にusingを使って失敗するリスクよりも、バカがリソースの開放を忘れて不具合が発生するリスクのほうがよっぽど大きい。

だから俺も言わせてもらう。とにかくusingを使え。Disposeしろ。Disposeも書けないような人とは結婚出来ません。

たとえば、以下のように使え。

using (FileStream fs = new FileStream("./aho.txt", FileMode.Open, FileAccess.Read))
using (StreamReader sr= new StreamReader(fs, Encoding.UTF8))
{
    // なんじゃりかんじゃり
}

これで、「なんじゃりかんじゃり」の中でエラーが起ころうと、爆発しようと、何があってもStreamはusing節を抜けたら閉じられ、リソースが開放されます。

「リソースが開放されます」というのは、具体的には、Dispose()が呼ばれるようになっています。なので、usingを使えるのはIDisposableインタフェースを実装するクラスだけです。

あと、「FlushしてからCloseだっけ?Finalize?」とか考えなくてもいいです。とにかくusingで囲めばよろしい。

(補足)
かならずDispose()の中で、正しい順序でリソースの廃棄処理が行われるかどうかは微妙なところです。つまり、そのIDisposableクラスの実装するクラスの作り方次第です。

しかし、少なくとも.NET Frameworkのライブラリで、Dispose()をいきなり呼んではいけない、というものを見たことがない。なので、.NET標準のクラスライブラリを使っている限りは、何も考えずusing任せにして問題ないはず。心配であれば、リファレンスを参照してほしい。

.NETじゃないアセンブリを使うときは、ちゃんと調べたほうがよさそう。まともな人ならばいきなりDisposeを呼んでも大丈夫なような実装にしていると期待しています。

以下とかも参照。
using ステートメント (C# リファレンス)
Dispose メソッドの実装