構造体とクラス (Visual Basic)Structures and Classes (Visual Basic)

Visual Basic では、構造体と 2 つのエンティティに同じ機能のほとんどがサポートされる結果と共に、クラスの構文は統一します。Visual Basic unifies the syntax for structures and classes, with the result that both entities support most of the same features. ただし、構造体とクラスの重要な違いもします。However, there are also important differences between structures and classes.

クラスが参照型になるというメリットがある、参照を渡すことは、そのすべてのデータと構造体変数を渡すより効率的です。Classes have the advantage of being reference types — passing a reference is more efficient than passing a structure variable with all its data. その一方で、構造体では、グローバルなヒープ メモリの割り当ては必要ありません。On the other hand, structures do not require allocation of memory on the global heap.

構造体から継承することはできません、ため、構造体を拡張する必要のないオブジェクトに対してのみ使用してください。Because you cannot inherit from a structure, structures should be used only for objects that do not need to be extended. 構造体を使用して、作成するオブジェクトは、s インスタンスのサイズし、構造体とクラスのパフォーマンス特性を考慮します。Use structures when the object you wish to create has a small instance size, and take into account the performance characteristics of classes versus structures.


構造体とクラスは、次の点で似ています。Structures and classes are similar in the following respects:

  • 両方ともコンテナー型、メンバーとして他の種類が含まれていることを意味します。Both are container types, meaning that they contain other types as members.

  • 両方があるメンバーで、コンス トラクター、メソッド、プロパティ、フィールド、定数、列挙型、イベント、およびイベント ハンドラーを含めることができます。Both have members, which can include constructors, methods, properties, fields, constants, enumerations, events, and event handlers. ただし、これらのメンバーの宣言とを混同しないでください要素構造体の。However, do not confuse these members with the declared elements of a structure.

  • どちらのメンバーは、アクセス レベルを個別があることができます。Members of both can have individualized access levels. たとえば、1 つのメンバーを宣言できますPublic別およびPrivateします。For example, one member can be declared Public and another Private.

  • インターフェイスを両方実装できます。Both can implement interfaces.

  • 両方共有することが、コンス トラクター パラメーターの有無。Both can have shared constructors, with or without parameters.

  • 両方を公開できます、プロパティの既定、そのプロパティは、少なくとも 1 つのパラメーターを受け取ります。Both can expose a default property, provided that property takes at least one parameter.

  • 両方を宣言してイベントを発生させるし、デリゲートを宣言できます。Both can declare and raise events, and both can declare delegates.


構造体とクラスは、次のとおりで異なります。Structures and classes differ in the following particulars:

  • 構造体が値の型; クラスは、参照型します。Structures are value types; classes are reference types. クラス型としてのデータへの参照を格納しているのではなく、構造体型の変数には、構造体のデータが含まれています。A variable of a structure type contains the structure's data, rather than containing a reference to the data as a class type does.

  • 構造体を使用して、スタック割り当てです。クラスは、ヒープの割り当てを使用します。Structures use stack allocation; classes use heap allocation.

  • 構造体のすべての要素はPublic既定ではクラスの変数と定数はPrivate他のクラス メンバーは、既定でPublic既定。All structure elements are Public by default; class variables and constants are Private by default, while other class members are Public by default. クラス メンバーには、この動作は、既定の Visual Basic 6.0 のシステムとの互換性を提供します。This behavior for class members provides compatibility with the Visual Basic 6.0 system of defaults.

  • 構造体の有効期限がありますに少なくとも 1 つの非共有変数または非共有、カスタム イベントの要素。クラスは、完全に空にすることができます。A structure must have at least one nonshared variable or nonshared, noncustom event element; a class can be completely empty.

  • 構造体の要素として宣言できませんProtected; クラスのメンバーのことができます。Structure elements cannot be declared as Protected; class members can.

  • 構造体のプロシージャはイベントを処理できる場合にのみ、 Shared Subプロシージャとのことによってのみ、 AddHandler ステートメント; 任意のクラスのプロシージャは、いずれかのを使用して、イベントを処理できます処理キーワードまたはAddHandlerステートメント。A structure procedure can handle events only if it is a SharedSub procedure, and only by means of the AddHandler Statement; any class procedure can handle events, using either the Handles keyword or the AddHandler statement. 詳細については、「イベント」を参照してください。For more information, see Events.

  • 構造体の変数宣言は、初期化子または配列の初期サイズを指定できません。クラスの変数宣言できます。Structure variable declarations cannot specify initializers or initial sizes for arrays; class variable declarations can.

  • 構造体は暗黙的に継承、System.ValueTypeクラスし、その他の型から継承できませんクラスが以外のすべてのクラスまたはクラスから継承できますSystem.ValueTypeします。Structures implicitly inherit from the System.ValueType class and cannot inherit from any other type; classes can inherit from any class or classes other than System.ValueType.

  • 構造体が継承可能です。クラスです。Structures are not inheritable; classes are.

  • 共通言語ランタイム (CLR) を呼び出すことはありませんので、構造体は終了ことはありませんが、Finalizeメソッド、構造体をクラスが呼び出すガベージ コレクター (GC) によって終了Finalizeアクティブな参照はありませんが検出されたときに、クラスの残りの。Structures are never terminated, so the common language runtime (CLR) never calls the Finalize method on any structure; classes are terminated by the garbage collector (GC), which calls Finalize on a class when it detects there are no active references remaining.

  • 構造体にコンス トラクターが必要としません。クラスは。A structure does not require a constructor; a class does.

  • 構造体を持つことができますパラメーターをとる場合にのみ、非共有コンス トラクター。パラメーターの有無は、クラスでそれらを持つことができます。Structures can have nonshared constructors only if they take parameters; classes can have them with or without parameters.

すべての構造体には、パラメーターを指定せず、暗黙の型のパブリック コンス トラクターがあります。Every structure has an implicit public constructor without parameters. このコンス トラクターでは、既定値に構造体のすべてのデータ要素を初期化します。This constructor initializes all the structure's data elements to their default values. この動作を再定義することはできません。You cannot redefine this behavior.

インスタンスと変数Instances and Variables

構造体は値型であるために、各構造体変数は個別の構造体インスタンスに完全にバインドされます。Because structures are value types, each structure variable is permanently bound to an individual structure instance. クラスは参照型、およびオブジェクト変数は、異なる時刻でさまざまなクラスのインスタンスを参照できます。But classes are reference types, and an object variable can refer to various class instances at different times. このような区別では、次の方法で構造体とクラスの使用量に影響します。This distinction affects your usage of structures and classes in the following ways:

  • 初期化します。Initialization. 構造体変数には、構造体のパラメーターなしのコンス トラクターを使用して要素の初期化で、暗黙的に含まれています。A structure variable implicitly includes an initialization of the elements using the structure's parameterless constructor. そのため、Dim s As struct1と等価Dim s As struct1 = New struct1()します。Therefore, Dim s As struct1 is equivalent to Dim s As struct1 = New struct1().

  • 変数の代入。Assigning Variables. 構造体の 1 つの変数を別に代入するか、またはプロシージャの引数に構造体のインスタンスを渡すときに、変数のすべての要素の現在の値は、新しい構造にコピーされます。When you assign one structure variable to another, or pass a structure instance to a procedure argument, the current values of all the variable elements are copied to the new structure. 別、1 つのオブジェクト変数の代入するか、またはオブジェクト変数をプロシージャに渡す参照ポインターのみがコピーされます。When you assign one object variable to another, or pass an object variable to a procedure, only the reference pointer is copied.

  • Nothing を代入します。Assigning Nothing. 値を割り当てることができますNothing変数がインスタンスで、変数に関連する継続構造体。You can assign the value Nothing to a structure variable, but the instance continues to be associated with the variable. メソッドを呼び出すし、可変要素が、代入によって再初期化されますが、そのデータ要素にアクセスすることができますも。You can still call its methods and access its data elements, although variable elements are reinitialized by the assignment.

    オブジェクト変数を設定した場合とは異なり、 Nothing、任意のクラスのインスタンスから関連付けを解除し、別のインスタンスを割り当てるまで、変数をメンバーにアクセスすることはできません。In contrast, if you set an object variable to Nothing, you dissociate it from any class instance, and you cannot access any members through the variable until you assign another instance to it.

  • 複数のインスタンス。Multiple Instances. オブジェクト変数が、異なるタイミングに、それに割り当てられている別のクラス インスタンスを持つことができ、いくつかのオブジェクト変数が同時に、同じクラスのインスタンスを参照できます。An object variable can have different class instances assigned to it at different times, and several object variables can refer to the same class instance at the same time. クラス メンバーの値に加えた変更は、同じインスタンスを指す別の変数を使用してアクセスするときにそのメンバーに影響します。Changes you make to the values of class members affect those members when accessed through another variable pointing to the same instance.

    ただし、構造体の要素は、独自のインスタンス内で分離されます。Structure elements, however, are isolated within their own instance. 他の同じインスタンスであっても、別の構造体変数にその値への変更は反映されませんStructure宣言します。Changes to their values are not reflected in any other structure variables, even in other instances of the same Structure declaration.

  • 等しいかどうか。Equality. 2 つの構造の等価テストは、要素ごとのテストを実行する必要があります。Equality testing of two structures must be performed with an element-by-element test. 使用して 2 つのオブジェクト変数を比較することができます、Equalsメソッド。Two object variables can be compared using the Equals method. Equals 2 つの変数を指す同じインスタンスかどうかを示します。Equals indicates whether the two variables point to the same instance.

関連項目See also