Visual Basicでは、ユーザー定義型(VB6のTypeまたはVB.NETのStructure)を使用して、複数の異なる型の変数を含む独自の複合型を定義できます。これは関連するデータをパッケージ化するのに便利です。
UDTs(VB6):
Type Person Name As String Age As Integer Height As Single End Type Dim employee As Person employee.Name = "アレクセイ" employee.Age = 32 employee.Height = 1.85
Structures(VB.NET):
Structure Person Public Name As String Public Age As Integer Public Height As Single End Structure Dim employee As Person employee.Name = "アレクセイ"
使用するタイミング:
対照的に: クラスは、ロジックのカプセル化、継承、多態性、またはインターフェースの実装が必要な場合に使用されます。
なぜVB.NETの構造体に
Nothingを割り当てることができないのか?
答え: クラスの変数(オブジェクト)にのみNothingを割り当てることができます。なぜなら、クラスは参照を保持するからです。構造体は値型であり、常に一連の値を含むため、Nothingを割り当てようとするとコンパイルエラーが発生します。
Dim s As Person = Nothing 'エラー!構造体はNothingにできません(Nullable(Of T)を除く)
ストーリー
古いプロジェクトで、プリミティブの配列を複数フィールドを持つ構造体に置き換えたところ、新しいコードが予想外に遅くなった。調査した結果、構造体のサイズが非常に大きく、関数内で頻繁にコピーされていたことが判明した。クラスを使用していれば、参照のみがコピーされ、完全な構造体はコピーされなかった。
ストーリー
VB6-UDTをVB.NETに移植した後、開発者の一人がリモート呼び出しの構造体に対して
ISerializableインターフェースを実装しなかった。その結果、シリアライズできないオブジェクトが生じ、プロセス間通信に失敗する結果となった。
ストーリー
幾何学用のモジュールで、構造体が配列(ミュータブル)への参照を保持していた。この構造体の複数のインスタンスが同じデータ配列を参照していたため、内部でのミューテーションがすべてのコピーに反映されるという予期しない効果が生じた。