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
を使うのが一番スマートなのかもしれないが。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント