■ Dim x As New MyClass
- Dim x As New MyClass の動作が変更
Visual Basic .NET では、このコードによる動作が変更されました。
Visual Basic 6.0 では、このコードのある行ではオブジェクトは生成されずに、それを利用するタイミングに、オブジェクトがすでに作られているかどうかをチェックし、なければ作成されるというものでした。これによる利点と欠点は次の通りです。
利点 (Visual Basic 6.0)
必ずオブジェクトが存在することが保証される (Nothing を設定してオブジェクトが破棄されたとしても、オブジェクトを再利用しようとすると、再作成される)
欠点 (Visual Basic 6.0)
オーバーヘッド (オブジェクトが利用されるたびに毎回チェックが入る)
明示的なオブジェクトの管理がしにくい
Visual Basic .NET では、
Dim x As New MyClass()
は、
Dim x As MyClass
x = New MyClass()
を 1 行で書き表わしたものにすぎません。そのため、Visual Basic 6.0 とは異なり、New されるのは後にも先にも 1 回だけです。もちろんオーバーヘッドもありません。
アップグレードウィザードではコードは変更されません。ここでポイントとなるのは、コードは変更されないけれども、その意味は違ってしまっているという点です。
Visual Basic 6.0 でこのコードを使っている場合、上記の利点 (常にオブジェクトがあることが保障されている) を期待している場合が多いでしょう。しかし、Visual Basic .NET ではその限りではないことに注意しなくてはいけないのです。もし、Visual Basic 6.0 で 「オブジェクトがあることを常に期待するプログラム」 を書いているときは、Visual Basic .NET では変更が必要になります。
原則として、Visual Basic 6.0 では、
Dim x As New MyClass
はオーバーヘッドが大きいので、使うべきではありません。どうしても、そのようなプログラムが便利だという場合は、Visual Basic .NET になったときに、コードを変更する覚悟が必要です。
Visual Basic .NET でも、常にオブジェクトが存在することを期待するプログラミングを実現したい場合、例外処理を利用することもできます。 Visual Basic .NET では、オブジェクトを利用しようとした際に、オブジェクトが見つからないと例外を検出するので、必要に応じて
x=New MyClass
を行なうというコードを書くこともできます。