■ 構造体の中の配列と固定長文字列

  • 構造体の宣言時

          配列の要素数は指定できない

          固定長文字列は使えない

変更ポイント

Visual Basic 6.0 では、ユーザー定義型の要素として、配列を宣言するとき、その要素数を指定できました。また、固定長文字列も指定できました。

ユーザー定義型は、Visual Basic .NET では構造体 (Structure) といいます。この構造体の宣言時に、配列の要素数の指定や、固定長文字列を使うことはできなくなりました。

アップグレードウィザードによる変更点

アップグレードウィザードは、これらの変更ポイントを自動で変更してくれます。

次のような Visual Basic 6.0 で作ったユーザー定義型をアップグレードすると、

[ Visual Basic 6.0 のコード]

                  
Private Type MyType
    MyArray(5) As Integer
    MyString As String * 100
End Type

次のような、構造体になります。

[ Visual Basic .NET にアップグレード]

                  
Private Structure MyType
    Dim MyArray() As Short
    <VBFixedString(100), System.Runtime.InteropServices.Marshal As _
    System.InteropServices.UnmanagedType.ByValTStr, SizeConst:=100)>
    Dim MyString As String
    Public Sub Initialize()
        ReDim MyArray(5)
    End Sub
End Structure

この構造体には、配列の要素数を初期化するためのユーザー定義関数 (Initialize) が含まれています。この関数を利用して配列の要素を初期化するよう、TODO コメントも追加されるので、このコメントを参考に、配列の要素数を初期化します。

また、固定長文字列については、可変長文字列に変更されていますが、固定配列やマーシャリングのための属性が追加されているので、固定長文字列のように利用できます。

今、何をしておくべきか?

この文法の変更に対処する方法はふたつあります。

たとえば、Visual Basic .NET での変化に備えて、あらかじめ固定長文字列を利用しないようにすることです。たとえば、以下のように可変長文字列にしておき、必要に応じて配列の要素数を指定する初期化処理を行ないます。

                  
Private Type MyType
    MyArray() As Integer
    MyFixedString As String
End Type

Sub Bar()
    Dim MyVariable As MyType
    ReDim MyVariable.MyArray(5) As Integer
    MyVariable.MyFixedString = String$(100, " ")
End Sub 

あるいは、初期化のための関数を作成し、それを利用して要素数を指定してもよいでしょう。

そして、もうひとつの対処法は、Visual Basic .NET になってからアップグレードウィザードでできる限り変換後、必要に応じて手動で修正するという方法です。

このいずれかの選択になります。