ProgrammingVB/VB.NET 開発者

Visual Basicでユーザー定義型(UDT)をどのように実装し、クラスの代わりに使用すべき状況は何ですか?

Hintsage AIアシスタントで面接を突破

答え

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インターフェースを実装しなかった。その結果、シリアライズできないオブジェクトが生じ、プロセス間通信に失敗する結果となった。


ストーリー

幾何学用のモジュールで、構造体が配列(ミュータブル)への参照を保持していた。この構造体の複数のインスタンスが同じデータ配列を参照していたため、内部でのミューテーションがすべてのコピーに反映されるという予期しない効果が生じた。