2021-03-02に投稿

【C#】「単純なusingステートメント」の違和感

usingは外部リソースを確実に解放するために用いる。

たとえば、

using (var sw = new StringWriter(filePath, append: true, Encoding.UTF8))
{
    sw.Write(hoge);
}

と書けば、スコープを抜けた時点でファイルが確実に解放される。いちいちCloseとかDisposeとかしなくて済むのだ。これは素晴らしい。

処理が単一ステートメントであれば{}は省略できるので、

using (var sw = new StringWriter(filePath, append: true, Encoding.UTF8))
    sw.Write(hoge);

このように書ける。これも全く同じ意味で、if{}を省略しているのと変わらない。ので、今までこう書いていたが、C#8.0では以下のようにメッセージが表示される。

IDE0063:'using'ステートメントは単純にできます

推奨の修正を適用すると、

using (var sw = new StringWriter(filePath, append: true, Encoding.UTF8));
sw.Write(hoge);

となる。これも動くんだけど違和感がすごい。なんというか、usingの後に{}があればスコープはそこに限定されるし、なければ次の単一処理がスコープになっているとはっきりわかる。

でもこれ、

using (var sw = new StringWriter(filePath, append: true, Encoding.UTF8));
sw.Write(hoge);
sw.Write(fuga);

ってかけるんだよね。で、fugaも書き込まれるんだよね。じゃあスコープはいつまで有効なの?というと、その変数の範囲らしい。

個人的には使わなくなったらとっととDisposeしないと気持ち悪いので、IDEの警告を抑制して無視して、従来通り{}を必要に応じて使ってスコープを明記することにした。もっとも、そこだけメソッドに切り出して単純なusingを使うのが一番スマートなのかもしれないが。

Originally published at boyi.sh
ツイッターでシェア
みんなに共有、忘れないようにメモ

あぱしょに

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント