[C#]using

Javaではパッケージ、他クラス使うとかでimportを使います。
C#では名前空間、他クラス使うとかではusingを使います。

JavaとかC#とか(他は知らないw)にあるGC。
使い終わったオブジェクトを破棄してくれる優れもの。
初めて聞いたときはすごいじゃん!とか思ってたら

            いつか破棄してくれる

という事に笑った記憶があるGCです。

例えば

こんな感じでnullを代入して誰からも参照されなくなった時とか

こんな感じでnullは入れてないけどスコープを抜けた時とか

このような時にGCさんが重い腰を上げてくれますね

いつか

ではこのような場合はどうだろうか

スコープから抜けるからGCさんの獲物になりそうな予感がします。
ただ、このストリームは閉じられていません。
なのでこのテキストファイルはGCさんが働いてくれないとずっと開きっぱなしになります。(この例だと、開きっぱなしなので他の人もオープンできない)
StreamReaderクラスのClose()を使ってしっかり閉めてあげないといけません。

そもそもJavaでもトイレの扉でも開けたら閉めるのは常識ですね。

閉めるだけのClose()ではなく便利なものがあります。
IDisposableインターフェースの使い終わったリソースを解放するためのDispose()というメソッドがあります。
Close()ではなくDispose()ひとつでOKです。

使い方としては

Close()の代わりに使う感じですね。
ただこの例だと、処理の時に例外が発生してしまった場合にDispose()を通りません。
なのでfinallyブロックを作ってあげることが必須です。

こんな感じですね、大したこと書いてないのにただ高さがありますね。

ここで本題なのですが、C#には自動でDispose()してくれる
using
というのがあります。Javaでいうtry-with-resourcesみたいな
先ほどの例を変えてみると。。。

こんな感じで半分になりました!自動的にfinallyでDispose()してくれます。
便利。

ただ、インポートする時にusing使ってるんだから違うキーワードにしてくれても良いのに・・・
と思った愚痴の記事でした。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする