【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を使うのが一番スマートなのかもしれないが。