2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-21

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

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
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?