朧研究所(おぼろけんきゅうじょ)

日々の買ったもの、考えたこと、調べたこと、便利なもの、おでかけ、プログラムを書いていきます。

Usingステートメントを利用したVBのテキスト・ファイルの作成

■Usingステートメントを利用したVBのテキスト・ファイルの作成

usingを使うと、必ず開放処理をしないといけないオブジェクトを開放するのを自動で行ってくれます。

例えば、ファイル、データベース接続、ウィンドウハンドルなど。

Closeメソッドを書く必要がなくなります。

Sub Main()

Using writer As New System.IO.StreamWriter("c:\sample.txt")

writer.WriteLine("(テキスト・ファイルの内容)")

End Using

' writer.WriteLine("コンパイル・エラーになる行")

End Sub

Using ステートメントでは、通常、何らかのオブジェクトを作成し(New)、その参照を変数に格納する。

そして、UsingからEnd Usingまでの範囲を抜け出す際には、その変数が参照しているオブジェクトのDisposeメソッドが確実に呼び出されるという仕組み。

(「Dispose」は「処分する」という意味)。

多くのクラスがDisposeメソッドを実装しているが、StreamWriterクラスの場合、Disposeメソッドはファイルを閉じる機能に相当する。

(実際、StreamWriterクラスのCloseメソッドはDisposeメソッドを呼び出すだけである)

つまり、正常終了であろうと、例外の発生であろうと、この範囲から抜け出そうとした時点で、確実にファイルは閉じられる。

また、閉じてしまった後にファイルへアクセスしようとすると、コンパイラが教えてくれることも重要なメリットです。

例えば、

' writer.WriteLine("コンパイル・エラーになる行")

という行の先頭の「'」記号を外してビルドすると、ビルド・エラーとなってプログラムはコンパイルできない。

Usingキーワードで宣言した変数(この場合には変数writer)の有効範囲(スコープ)は、End Usingまで。

そのため、ファイルを閉じた後でこの変数writerにアクセスすることはできないからです。

ファイルに何らかのデータを書き込んでいる途中で例外が発生し、ファイルを閉じないまま放置された場合、そのファイルにアクセスできなくなる可能性がある。

そのため、開いたファイルは確実に閉じなくてはならない。

同じように、取得したら確実に解放しなければならない、という強い条件を付けられた機能やリソースはいろいろある。

例えばデータベースやネットワークへのコネクションなどはその一例である。

Try-Finallyステートメントは、このような問題を解決するための切り札といえるだろう。

しかし、Try-Finallyステートメントはあまりに原始的すぎて、プログラマへの負担が大きい。

つまり、ソース・コードが長くなりがちで、しかも正しく使うには注意力が必要とされる。

Usingステートメントとは、ファイルを始めとするさまざまなリソースを、もっと短く、もっと安全に、そして、もっと楽に扱えるようにしてくれる機能なのである。