Visual Studio 2008 もベータ2が公開されたということで、次期 Visual Basic 9.0 の新機能をぼちぼちいじっていきたいと思います。
ただし、このエントリは Beta 2 時点のものですので、将来の製品版では仕様が変更される可能性が十分にありますので、あくまでもネタとして・・・。
ということで、初回は、型推測について。
VB9(VS2008)Beta2 では、型の推測機能が備わっています。
従来のコード
Dim testObject As New TestClass()
上記のコードは
Dim testObject As TestClass = New TestClass()
の省略形で、右辺の TestClass 型に定義されたオブジェクト変数に対して、
右辺に記述された TestClass の新規インスタンスが代入されています。
このコードをVB9では以下のように記述することが可能となっています。
Dim testObject = New TestClass()
上記コードでは、従来であれば、Object 型のオブジェクト変数に対して
右辺に記述された TestClass の新規インスタンスが代入されますが、
VB9では振る舞いが違い、コンパイラ(VB のコードパーサー?)が、
右辺の型を推測し、左辺の変数をしかるべき型に定義します。
この例の場合、左辺が返す TestClass 型のインスタンスより、
testObject を TestClass 型で定義します。
では、以下のコードではどうでしょう?
Dim testObject
testObject = New TestClass()
一見すると、初期化式が分割され、2行に渡るように記述し直したように
思えますが、このコードでは最初のステップで Object 型の変数 testObject を
定義し、TestClass の新規インスタンスを代入しており、最初のものとは
まったく振る舞いが違います。
この動作については、値型の変数にも同様に行われるようで、
Dim maybeInteger = 1I '--- Integer 型
Dim maybeInteger = 1 \ 2 '--- Integer 型
Dim maybeDouble = 1 / 2 '--- Double 型
Dim integerValue As Integer = 1
Dim maybeInteger = integerValue '--- Integer 型
Dim maybeInteger = ReturnInteger() '--- Integer 型
Function ReturnInteger() As Integer
Return 1I
End Function
のように、計算式、メソッド等も戻り値のデータ型を判断し、型を決定づけています。
もちろん、コード記述時のバックエンドコンパイラも同様の型推測を行いますので、
型が推測された変数に対しては、プロパティ等の参照も可能となるため、インテリセンスも
正常に動作します。
タイプ数を減らす点ではこの記述は有効ではあるのだけど、可視性/視認性のあるコードを
書くという点では、コードが複雑化すると間違いなく自分を見失う要因ではあるので、
あまりお勧めはできません。
この型推測について、C# 3.0 では、var キーワードを用いていますが、
VB では通常の変数定義と型推測を行う変数定義に同じ Dim キーワードを用いている点が
混乱の要因となるのかなという気がします。
しかしながら、自分は根っからの VB ユーザーであるということで、個人的には Dim キーワードを
用いた方が VB の言語仕様としてはなぜだかしっくりきてしまうのは私だけ・・・?