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