tag:crieit.net,2005:https://crieit.net/tags/C%238.0/feed 「C#8.0」の記事 - Crieit Crieitでタグ「C#8.0」に投稿された最近の記事 2021-03-02T20:29:59+09:00 https://crieit.net/tags/C%238.0/feed tag:crieit.net,2005:PublicArticle/16711 2021-03-02T20:29:59+09:00 2021-03-02T20:29:59+09:00 https://crieit.net/posts/csharp-strangeness-in-a-simple-using-statement 【C#】「単純なusingステートメント」の違和感 <p><code>using</code>は外部リソースを確実に解放するために用いる。</p> <p>たとえば、</p> <pre><code class="csharp">using (var sw = new StringWriter(filePath, append: true, Encoding.UTF8)) { sw.Write(hoge); } </code></pre> <p>と書けば、スコープを抜けた時点でファイルが確実に解放される。いちいち<code>Close</code>とか<code>Dispose</code>とかしなくて済むのだ。これは素晴らしい。</p> <p>処理が単一ステートメントであれば<code>{}</code>は省略できるので、</p> <pre><code class="csharp">using (var sw = new StringWriter(filePath, append: true, Encoding.UTF8)) sw.Write(hoge); </code></pre> <p>このように書ける。これも全く同じ意味で、<code>if</code>の<code>{}</code>を省略しているのと変わらない。ので、今までこう書いていたが、C#8.0では以下のようにメッセージが表示される。</p> <blockquote> <p>IDE0063:'using'ステートメントは単純にできます</p> </blockquote> <p>推奨の修正を適用すると、</p> <pre><code class="csharp">using (var sw = new StringWriter(filePath, append: true, Encoding.UTF8)); sw.Write(hoge); </code></pre> <p>となる。これも動くんだけど違和感がすごい。なんというか、<code>using</code>の後に<code>{}</code>があればスコープはそこに限定されるし、なければ次の単一処理がスコープになっているとはっきりわかる。</p> <p>でもこれ、</p> <pre><code class="csharp">using (var sw = new StringWriter(filePath, append: true, Encoding.UTF8)); sw.Write(hoge); sw.Write(fuga); </code></pre> <p>ってかけるんだよね。で、<code>fuga</code>も書き込まれるんだよね。じゃあスコープはいつまで有効なの?というと、その変数の範囲らしい。</p> <p>個人的には使わなくなったらとっとと<code>Dispose</code>しないと気持ち悪いので、IDEの警告を抑制して無視して、従来通り<code>{}</code>を必要に応じて使ってスコープを明記することにした。もっとも、そこだけメソッドに切り出して単純な<code>using</code>を使うのが一番スマートなのかもしれないが。</p> あぱしょに