Structure ステートメント

構造体の名前を宣言し、構造体を構成する変数、プロパティ、イベント、およびプロシージャの定義を提供します。

構文

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Partial ] _
Structure name [ ( Of typelist ) ]
    [ Implements interfacenames ]
    [ datamemberdeclarations ]
    [ methodmemberdeclarations ]
End Structure

指定項目

用語 定義
attributelist 任意。 「属性リスト」を参照してください。
accessmodifier 任意。 次のいずれかの値を指定します。

- Public
- Protected
- Friend
- Private
- Protected Friend
- Private Protected

Access levels in Visual Basic」を参照してください。
Shadows 任意。 「Shadows」を参照してください。
Partial 任意。 構造体の部分定義を示します。 「Partial」を参照してください。
name 必須です。 この構造体の名前です。 「 Declared Element Names」を参照してください。
Of 任意。 これがジェネリックな構造体であることを指定します。
typelist Of キーワードを使用する場合は必須です。 この構造体の型パラメーター リストを指定します。 「型リスト」を参照してください。
Implements 任意。 この構造体が、複数のインターフェイスのメンバーを実装していることを示します。 「Implements ステートメント」を参照してください。
interfacenames Implements ステートメントを使用する場合は必ず指定します。 この構造体が実装するインターフェイスの名前を指定します。
datamemberdeclarations 必須です。 構造体のデータ メンバーを宣言する、0 個以上の ConstDimEnum、または Event ステートメント。
methodmemberdeclarations 省略可能。 構造体のメソッド メンバーとして機能する、FunctionOperatorProperty、または Sub プロシージャの 0 個以上の宣言。
End Structure 必須です。 Structure の定義を終了します。

Remarks

Structure ステートメントは、カスタマイズできる複合値型を定義します。 構造体は、以前のバージョンの Visual Basic にあったユーザー定義型 (UDT: User-Defined Type) を一般化したものです。 詳細については、「構造体」を参照してください。

構造体は、クラスと同じ機能の多くをサポートします。 たとえば、構造体は、プロパティやプロシージャを持つことができ、インターフェイスを実装でき、パラメーター化されたコンストラクターを持つことができます。 ただし、継承、宣言、および使用方法に関しては、構造体とクラスの間には大きな違いがあります。 また、クラスは参照型ですが、構造体は値型です。 詳細については、「構造体とクラス」を参照してください。

Structure は、名前空間またはモジュール レベルでのみ使用できます。 つまり、構造体の宣言コンテキストは、ソース ファイル、名前空間、クラス、構造体、モジュール、またはインターフェイスのいずれかである必要があり、プロシージャまたはブロックでは宣言できません。 詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。

構造体は、既定で Friend アクセスに設定されます。 アクセス修飾子を使用してこれらのアクセス レベルを調整できます。 詳しくは、「Visual Basic でのアクセス レベル」を参照してください。

ルール

  • 入れ子。 構造体の内部に別の構造体を定義できます。 外側の構造体は包含構造体と呼ばれ、内側の構造体は入れ子構造体と呼ばれます。 ただし、包含構造体をとおして入れ子構造体のメンバーにアクセスすることはできません。 入れ子構造体のメンバーにアクセスするには、入れ子構造体のデータ型の変数を宣言する必要があります。

  • メンバーの宣言。 構造体のすべてのメンバーを宣言する必要があります。 構造体からは何も継承できないため、構造体のメンバーを Protected または Protected Friend にすることはできません。 ただし、構造体そのものをProtected または Protected Friend にすることはできます。

    0 個または 1 つ以上の非共有変数または非共有の非カスタム イベントを構造体内で宣言することができます。 非共有ではあっても、定数、プロパティ、およびプロシージャだけを宣言することはできません。

  • 初期化。 構造体の非共有データ メンバーの値を宣言の一部として初期化することはできません。 構造体のパラメーター化されたコンストラクターを使ってそのようなデータ メンバーを初期化するか、または構造体のインスタンスを作成した後にメンバーに値を割り当てる必要があります。

  • 継承。 構造体は、ValueType 以外の型を継承できません。すべての構造体が、この型を継承します。 特に、構造体は別の構造体を継承できません。

    ValueType を指定する場合でも、構造体の定義で Inherits ステートメントを使用することはできません。

  • 実装: 構造体で Implements ステートメントを使用する場合、interfacenames に指定するすべてのインターフェイスによって定義されたすべてのメンバーを実装する必要があります。

  • 既定のプロパティ。 構造体には、Default 修飾子を使って、最大で 1 つのプロパティをその既定のプロパティとして指定できます。 詳細については、「Default」を参照してください。

動作

  • アクセス レベル。 構造体の内部では、各メンバーを独自のアクセス レベルで宣言できます。 すべての構造体メンバーは、既定で Public アクセスに設定されます。 構造体そのものにこれより厳しいアクセス レベルを指定した場合は、たとえアクセス修飾子を使ってメンバーのアクセス レベルを調整していても、メンバーへのアクセスが自動的に制限されることに注意してください。

  • 範囲。 構造体は、そこに含まれる名前空間、クラス、構造体、またはモジュールをスコープとします。

    すべての構造体メンバーのスコープは、構造体全体になります。

  • [Lifetime](有効期間)。 構造体に有効期間はありません。 ただし、構造体の各インスタンスには、他のインスタンスに依存しない独自の有効期間があります。

    インスタンスの有効期間は、New Operator 句によって作成された時点で開始されます。 インスタンスに含まれる変数の有効期間が終わった時点で、そのインスタンスの有効期間は終わります。

    構造体インスタンスの有効期間を延長することはできません。 静的構造体に相当する機能は、モジュールに用意されています。 詳細については、「Module ステートメント」を参照してください。

    構造体メンバーの有効期間は、それを宣言する方法と場所で決まります。 詳細については、「Class ステートメント」の「有効期間」を参照してください。

  • 修飾。 構造体の外部にあるコードでは、メンバーの名前をその構造体の名前で修飾する必要があります。

    入れ子構造体の内部のコードでプログラミング要素を修飾なしで参照した場合、Visual Basic はその要素をまず入れ子構造体の内部で探し、その次にコンテナー構造体の内部で探します。この手順が、最も外側のコンテナー要素にまで繰り返されます。 詳細については、「 References to Declared Elements」を参照してください。

  • メモリの使用量。 他のすべての複合データ型と同様に、構造体の総メモリ使用量を計算する場合、各メンバーのストレージ割り当ての公称サイズを単に合計しただけでは安全ではありません。 さらに、メモリ内に格納される順序が宣言の順序と同じであると仮定するのも安全ではありません。 構造体のストレージ レイアウトを制御する必要がある場合は、StructLayoutAttribute 属性を Structure ステートメントに適用します。

次の例では、Structure ステートメントを使って、従業員に関連のある複数のデータを定義しています。 データ項目の機密性に応じて PublicFriendPrivate の各メンバーを使用する方法が示されています。 プロシージャ、プロパティ、およびイベント メンバーも示されています。

Public Structure employee
    ' Public members, accessible from throughout declaration region.
    Public firstName As String
    Public middleName As String
    Public lastName As String
    ' Friend members, accessible from anywhere within the same assembly.
    Friend employeeNumber As Integer
    Friend workPhone As Long
    ' Private members, accessible only from within the structure itself.
    Private homePhone As Long
    Private level As Integer
    Private salary As Double
    Private bonus As Double
    ' Procedure member, which can access structure's private members.
    Friend Sub CalculateBonus(ByVal rate As Single)
        bonus = salary * CDbl(rate)
    End Sub
    ' Property member to return employee's eligibility.
    Friend ReadOnly Property Eligible() As Boolean
        Get
            Return level >= 25
        End Get
    End Property
    ' Event member, raised when business phone number has changed.
    Public Event ChangedWorkPhone(ByVal newPhone As Long)
End Structure

Structure の使用方法の詳細については、「構造体の変数」を参照してください。

関連項目