search
LoginSignup
3

More than 5 years have passed since last update.

posted at

updated at

csharp > usingステートメント > 自動的にDispose()を呼び出してくれ、しかも、例外にも対応してくれる便利な構文

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()の引数についても訂正コメントいただき、対応箇所を訂正しました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3