Structure ステートメント

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

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

指定項目

語句

定義

attributelist

省略可能です。「属性リスト」を参照してください。

accessmodifier

省略可能です。次のいずれかになります。

Visual Basic でのアクセス レベル」を参照してください。

Shadows

省略可能です。「Shadows」を参照してください。

Partial

省略可能です。構造体の部分定義を示します。「Partial (Visual Basic)」を参照してください。

name

必ず指定します。この構造体の名前です。「宣言された要素の名前 (Visual Basic)」を参照してください。

Of

省略可能です。これがジェネリックな構造体であることを指定します。

typelist

Of キーワードを使用する場合は必ず指定します。この構造体の型パラメーター リストを指定します。「型リスト」を参照してください。

Implements

省略可能です。この構造体が、複数のインターフェイスのメンバーを実装していることを示します。「Implements ステートメント」を参照してください。

interfacenames

Implements ステートメントを使用する場合は必ず指定します。この構造体が実装するインターフェイスの名前を指定します。

datamemberdeclarations

必ず指定します。構造体のデータ メンバーを宣言する、1 つ以上の Const、Dim、Enum、または Event ステートメントを指定します。

methodmemberdeclarations

省略可能です。構造体のメソッド メンバーとして機能する、Function、Operator、Property、または Sub の各プロシージャの宣言を 0 またはそれ以上指定します。

End Structure

必ず指定します。Structure の定義を終了します。

解説

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

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

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

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

規則

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

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

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

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

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

    たとえ ValueType を指定するためであっても、Inherits ステートメント を構造体の定義で使用することはできません。

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

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

[動作]

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

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

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

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

    インスタンスの有効期間は、New 演算子 (Visual Basic) 句で作成された時点で開始されます。インスタンスに含まれる変数の有効期間が終わった時点で、そのインスタンスの有効期間は終わります。

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

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

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

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

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

使用例

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

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

参照

関連項目

Class ステートメント (Visual Basic)

Interface ステートメント (Visual Basic)

Module ステートメント

Dim ステートメント (Visual Basic)

Const ステートメント (Visual Basic)

Enum ステートメント (Visual Basic)

Event ステートメント

Operator ステートメント

Property ステートメント

概念

構造体とクラス (Visual Basic)