tag:crieit.net,2005:https://crieit.net/tags/using/feed
「using」の記事 - Crieit
Crieitでタグ「using」に投稿された最近の記事
2021-03-02T20:29:59+09:00
https://crieit.net/tags/using/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>
あぱしょに