VB.NET 構造体 配列の初期化

構造体の中に配列を含める場合、初期化時に注意が必要です。

構造体の中に配列を宣言する

Structure Data
    Dim A As Integer
    Dim B As String
    Dim C() As Integer
    Dim D() As Integer = {10,50,100}  'エラー
    Dim E(2) As Integer = {10, 50, 100}  'エラー
    Dim F(2) As Integer  'エラー
End Structure

構造体の中に配列を含める場合、空の配列の宣言のみ有効です。

初期化子を使って初期値を設定しようとしてもエラーとなります。

また、配列の長さを設定する事もできません。

実際に配列を使うには?

Structure Data
    Dim A As Integer
    Dim B As String
    Dim C() As Integer
End Structure

Module Module1
    Sub Main()
        Dim d As Data

        d.C = New Integer() {10, 50, 100}

        For Each data As Integer In d.C
            Console.WriteLine(data)
        Next
    End Sub
End Module
10
50
100

ひとつの方法として、Dimを使って構造体を宣言した場合は、
Newを使って配列を初期化します。

初期値を与えない場合は以下のような書き方です。

Integer型のように数値型の場合は、配列の各要素が0で初期化されます。
String型のような参照型の場合は、Nothingで初期化されます。

Dim d As Data
d.C = New Integer(2) {}

d.C(0) = 10
d.C(1) = 50
d.C(2) = 100
スポンサーリンク

コンストラクタを使用する方法

Structure Data
    Dim A As Integer
    Dim B As String
    Dim C() As Integer

    Sub New(len As Integer)
        Me.C = New Integer(len) {}
    End Sub

End Structure

Module Module1
    Sub Main()
        Dim d As New Data(2)

        d.C(0) = 10
        d.C(1) = 50
        d.C(2) = 100

        For Each data As Integer In d.C
            Console.WriteLine(data)
        Next
    End Sub
End Module
10
50
100

今度はコンストラクタを使って配列を初期化した例です。

コンストラクタを呼び出すにはNewキーワードが必要になります。

無理やり配列を使う方法

Structure Data
    Dim A1 As Integer
    Dim A2 As Integer
    Dim A3 As Integer
End Structure

Module Module1
    Sub Main()
        Dim d As Data

        d.A1 = 10
        d.A2 = 50
        d.A3 = 100

        Console.WriteLine(d.A1)
        Console.WriteLine(d.A2)
        Console.WriteLine(d.A3)
    End Sub
End Module

特殊な事情がある場合、
連続的なデータを手動で用意すれば、配列のように使う事もできます。
(あまりオススメはしませんが。)


以上、構造体の中の配列の初期化についての説明でした。