usingについて
MSDNのマニュアルより以下の方がわかりやすかった。
C#には、自動的にDispose()を呼び出してくれ、しかも、例外にも対応してくれる便利な構文があります。 それがusingです。 usingを使うとこんな風に書けます。
public void Func() {
using (FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.Read)) {
using (StreamReader sr = new StreamReader(fs)) {
// 処理する
}
}
}
このコードは下記のコードとまったく同じ意味です。 実際、これらのコードのILを見比べると100%まったく同じです。
public void Func() {
FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.Read);
try {
StreamReader sr = new StreamReader(fs);
try {
// 処理する
}
finally {
if (sr != null) {
sr.Dispose();
}
}
}
finally {
if (fs != null) {
fs.Dispose();
}
}
}
ただ、逆に言うとusingは自動的にtry ... finally を作ってくれて、finallyで必ずDispose()を呼び出すようにしてくれるだけです。 なので、例外に対処するために下記のようなコードになることが多いでしょう。
public void Func() {
using (FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.Read)) {
using (StreamReader sr = new StreamReader(fs)) {
try {
// 処理する
}
catch () {
// 例外処理
}
}
}
}
(2015/08/25 追記) @muro さんからnew時の例外についてのコメントをいただきました。 また、FileStream()の引数についても訂正コメントいただき、対応箇所を訂正しました。