これは、書籍『VB6プログラマーのための入門Visual Basic.NET独習講座』の読者サポート情報として提供されている技術解説です。
予約語をクラス名や変数名にできない問題 §
Visual Basic 6.0では、予約語をクラス名や変数名として使うことができない制約がある。これは、多くのプログラム言語にも共通に見られる制約と言え、特に奇異なことではない。
しかし、複数プログラム言語が混在した環境では、これが問題になる場合がある。たとえば、.NET Framework上では、他プログラム言語で作成したクラスライブラリを呼び出すことは容易だが、クラスライブラリが用意したクラス名などが、Visual Basicの予約語と重なる可能性が無いとは言えない。もし、予約語と重なると、その名前を持つクラスなどは使えないことになってしまう。
このような問題に対処するために、Visual Basic .NETには、エスケープ識別子(escaped identifier)と呼ばれる機能が用意されている。
エスケープ識別子を使った例 §
エスケープ識別子を用いて、Classという名前のクラスを作成してみた。もちろん、Classは予約語なので、通常では使えない。また、Integerという名前の変数と、Subという名前のメソッドも作成した。これらは、普通に記述しても予約語と重なるためエラーになるものである。
Public Class [Class]
Public Shared [Integer] As Integer = 0
Public Shared Sub [Sub]()
[Class].Integer += 1
End Sub
End Class
これを呼び出す側として、以下のようなコードを記述してみた。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
[Class].Sub()
Trace.WriteLine([Class].Integer)
End Sub
これを実行すると以下のようになる。
これを見て分かる通り、キーワードの前後に[……]を付ければ、予約語と重なるキーワードを記述することができる。これをエスケープ識別子という。
気になるのは、一部、予約語でありながらエスケープ識別子となっていないキーワードが見えることである。たとえば、[Class].Sub()というメソッド呼び出しは、予約語と重なるSubという名前のメソッド名を記述しているにも関わらず、エスケープ識別子になっていない。しかし、このままで正常にコンパイルして実行することができる。これは、構文上ここに予約語が出現せず、間違いなく予約語のSubではなく、メソッドのSubであると判断できるためだろう。
一方、Public Shared Sub [Sub]()というメソッドの宣言部分で[……]を取り去ると、これは構文エラーとなる。宣言部分で予約語と重なる名前を記述する場合は、エスケープ識別子が必要となる。
エスケープ識別子が必要とされるか判断に自信がない場合は、一律に予約語と重なる名前をエスケープ識別子として記述すると良いだろう。エスケープ識別子として記述する必要のない箇所で、エスケープ識別子として記述しても、特に問題は発生しない。