今回は、VB.NETの構造体とは?使い方やクラスとの違いも解説についてご紹介します。
構造体とは?
VB.NETの構造体は、値型として扱われるデータ構造です。
宣言時や代入時に実際の値がコピーされるため、メモリ上はスタックに配置されます。
このため生成や破棄の処理が高速で、比較的小規模なデータをまとめるのに適しています。
ただし継承はサポートされず、クラスのような複雑なオブジェクト指向設計には向きません。
一方でインターフェイスの実装は可能なので、軽量な設計と柔軟性を両立できます。
クラスとの違い
クラスは参照型として扱われ、インスタンスはヒープ上に生成されます。
複数の変数が同じインスタンスを共有し、代入時は参照のコピーが行われます。
構造体は値がコピーされるのに対して、クラスは参照を共有する点が大きな違いです。
またクラスには継承やポリモーフィズムがあり、複雑な機能を持たせることができます。
構造体は基本的に継承不可ですが、小規模かつ短期間で扱うデータ構造としてはパフォーマンスに優れています。
構造体の使い方と具体例
構造体はStructureキーワードで定義し、フィールドやメソッドを持たせることができます。
ただしパラメータ無しのコンストラクタは自動生成されるため、任意に定義することはできません。
以下にPoint構造体の定義と、その使用例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Module Program ' メインモジュール Sub Main() ' Point構造体のインスタンスを生成 Dim pt As New Point(3, 4) ' 原点からの距離を表示 Console.WriteLine("原点からの距離: " & pt.GetDistance()) End Sub End Module ' 座標を表す構造体 Public Structure Point Public X As Integer Public Y As Integer ' パラメータ付きコンストラクタ Public Sub New(xValue As Integer, yValue As Integer) X = xValue Y = yValue End Sub ' 原点からの距離を計算するメソッド Public Function GetDistance() As Double Return Math.Sqrt(X * X + Y * Y) End Function End Structure |
原点からの距離: 5
上記のように、構造体を使うと値そのものを扱うため、別の変数に代入した場合には全フィールドの値がコピーされます。
この仕組みにより、不用意にデータが共有されることを避けられますが、逆にコピーコストに注意が必要です。
大きなサイズの構造体を多用するとパフォーマンスを損なう可能性があります。
注意点
ボックス化(Boxing)に注意が必要です。
構造体をObject型にキャストすると、内部的にヒープ領域へデータがコピーされます。
これにより意図しないメモリ使用量の増加や処理のオーバーヘッドが発生する場合があります。
また構造体を変更可能な(ミュータブルな)設計にすると、コピーされるタイミングを見誤って不具合を生むケースがあります。
設計上はなるべく不変(イミュータブル)にするか、変更がある場合はその動作を明確に意識することが大切です。
まとめ
構造体は軽量かつ短命なデータに適した値型で、クラスは継承可能な参照型です。
用途に合わせて使い分けることで、メモリ効率と可読性を両立できます。
コピーの仕組みやボックス化の挙動などを正しく理解すると、より効率的な設計が可能です。