次の方法で共有


構造体とクラス (Visual Basic)

Visual Basic では、構造とクラスの構文が統合され、両方のエンティティが同じ機能の大部分をサポートするという結果が得られます。 ただし、構造体とクラスには重要な違いもあります。

クラスには参照型という利点があります。参照を渡す方が、すべてのデータを含む構造体変数を渡すよりも効率的です。 一方、構造体では、グローバル ヒープにメモリを割り当てる必要はありません。

構造体から継承できないため、構造体は拡張する必要のないオブジェクトにのみ使用する必要があります。 作成するオブジェクトのインスタンス サイズが小さい場合は構造体を使用し、クラスと構造体のパフォーマンス特性を考慮します。

類似 点

構造体とクラスは、次の点で似ています。

  • どちらも コンテナー 型であり、メンバーとして他の型が含まれていることを意味します。

  • どちらもメンバーを持ち、コンストラクター、メソッド、プロパティ、フィールド、定数、列挙型、イベント、およびイベント ハンドラーを含めることができます。

  • 両方のメンバーは、個別のアクセス レベルを持つことができます。 たとえば、1 つのメンバーを Public 宣言し、別の Privateを宣言できます。

  • どちらもインターフェイスを実装できます。

  • どちらも、パラメーターの有無にかかわらず、共有コンストラクターを持つことができます。

  • プロパティが少なくとも 1 つのパラメーターを受け取る場合、両方とも 既定のプロパティを公開できます。

  • どちらもイベントを宣言および発生させることができます。また、両方ともデリゲートを宣言できます。

相違点

構造体とクラスは、次の点で異なります。

  • 構造体は 値型です。クラスは 参照型です。 構造体型の変数には、クラス型のようにデータへの参照が含まれるのではなく、構造体のデータが含まれます。

  • 構造体はスタック割り当てを使用します。クラスはヒープ割り当てを使用します。

  • 既定では、すべての構造体要素が Public されます。クラス変数と定数は既定で Private され、他のクラス メンバーは既定で Public されます。 クラス メンバーに対するこの動作は、Visual Basic 6.0 システムの既定値との互換性を提供します。

  • 構造体には、少なくとも 1 つの非共有変数または非共有の非カスタム イベント要素が必要です。クラスは完全に空にすることができます。

  • 構造体要素を Protectedとして宣言することはできません。クラス メンバーは宣言できます。

  • 構造体プロシージャは、 SharedSub プロシージャの場合にのみ、および AddHandler ステートメントによってのみイベントを処理できます。クラス プロシージャは、 Handles キーワードまたは AddHandler ステートメントを使用してイベントを処理できます。 詳細については、「イベント」を参照してください。

  • 構造体変数宣言では、配列の初期化子または初期サイズを指定できません。クラス変数の宣言で使用できます。

  • 構造体は System.ValueType クラスから暗黙的に継承され、他の型から継承することはできません。クラスは、 System.ValueType以外のクラスから継承できます。

  • 構造体は継承できません。クラスは次のとおりです。

  • 構造体は終了しないため、共通言語ランタイム (CLR) は構造体に対して Finalize メソッドを呼び出すことはありません。クラスはガベージ コレクター (GC) によって終了されます。これは、アクティブな参照が残っていないとクラスで Finalize を呼び出します。

  • 構造体にはコンストラクターは必要ありません。クラスはそうします。

  • 構造体は、パラメーターを受け取る場合にのみ、非共有コンストラクターを持つことができます。クラスは、パラメーターの有無に関係なく、それらを持つことができます。

すべての構造体には、パラメーターのない暗黙的なパブリック コンストラクターがあります。 このコンストラクターは、構造体のすべてのデータ要素を既定値に初期化します。 この動作を再定義することはできません。

インスタンスと変数

構造体は値型であるため、各構造体変数は個々の構造体インスタンスに永続的にバインドされます。 ただし、クラスは参照型であり、オブジェクト変数は異なる時間にさまざまなクラス インスタンスを参照できます。 この違いは、次の方法で構造体とクラスの使用に影響します。

  • 初期化。 構造体変数には、構造体のパラメーターなしのコンストラクターを使用した要素の初期化が暗黙的に含まれます。 したがって、 Dim s As struct1Dim s As struct1 = New struct1()と同等です。

  • 変数の割り当て。 ある構造体変数を別の構造体に割り当てたり、構造体インスタンスをプロシージャ引数に渡したりすると、すべての変数要素の現在の値が新しい構造体にコピーされます。 あるオブジェクト変数を別のオブジェクト変数に割り当てたり、オブジェクト変数をプロシージャに渡したりすると、参照ポインターのみがコピーされます。

  • Nothing の割り当て。Nothing を構造体変数に割り当てることができますが、インスタンスは引き続き変数に関連付けられます。 変数要素は代入によって再初期化されますが、そのメソッドを呼び出してデータ要素にアクセスすることはできます。

    これに対し、オブジェクト変数を Nothing に設定すると、その変数はどのクラス インスタンスからも関連付け解除され、別のインスタンスを割り当てるまで変数を介してメンバーにアクセスすることはできません。

  • 複数のインスタンス。 オブジェクト変数には、異なる時間に異なるクラス インスタンスを割り当てることができ、複数のオブジェクト変数が同じクラス インスタンスを同時に参照できます。 クラス メンバーの値に加えた変更は、同じインスタンスを指す別の変数を介してアクセスした場合に、それらのメンバーに影響します。

    ただし、構造体要素は独自のインスタンス内で分離されます。 値の変更は、同じ Structure 宣言の他のインスタンスであっても、他の構造体変数には反映されません。

  • 平等。 2 つの構造体の等値テストは、要素ごとのテストで実行する必要があります。 Equalsメソッドを使用して、2 つのオブジェクト変数を比較できます。 Equals は、2 つの変数が同じインスタンスを指しているかどうかを示します。

こちらも参照ください