Structure ステートメント
更新 : 2007 年 11 月
構造体の名前を宣言し、構造体を構成する変数、プロパティ、イベント、およびプロシージャの定義を提供します。
[ <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
必ず指定します。この構造体の名前です。宣言された要素の名前 を参照してください。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) を一般化したものです。詳細については、「構造体 : 独自のデータ型」を参照してください。
構造体は、クラスと同じ機能の多くをサポートします。たとえば、構造体は、プロパティやプロシージャを持つことができ、インターフェイスを実装でき、パラメータ化されたコンストラクタを持つことができます。ただし、継承、宣言、および使用方法に関しては、構造体とクラスの間には大きな違いがあります。また、クラスは参照型ですが、構造体は値型です。詳細については、「構造体とクラス」を参照してください。
Structure は、名前空間またはモジュール レベルでのみ使用できます。つまり、構造体の宣言コンテキストは、ソース ファイル、名前空間、クラス、構造体、モジュール、またはインターフェイスのいずれかである必要があり、プロシージャまたはブロックでは宣言できません。詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。
既定で、構造体のアクセス レベルは Friend (Visual Basic) です。アクセス修飾子を使用してこれらのアクセス レベルを調整できます。詳細については、「Visual Basic でのアクセス レベル」を参照してください。
規則
**入れ子。**構造体の内部に別の構造体を定義できます。外側の構造体は包含構造体と呼ばれ、内側の構造体は入れ子構造体と呼ばれます。ただし、包含構造体をとおして入れ子構造体のメンバにアクセスすることはできません。入れ子構造体のメンバにアクセスするには、入れ子構造体のデータ型の変数を宣言する必要があります。
**メンバの宣言。**構造体のすべてのメンバを宣言する必要があります。構造体からは何も継承できないため、構造体のメンバを Protected または Protected Friend にすることはできません。ただし、構造体そのものをProtected または Protected Friend にすることはできます。
最低でも 1 つの非共有変数または非共有の非カスタム イベントを構造体に宣言する必要があります。非共有ではあっても、定数、プロパティ、およびプロシージャだけを宣言することはできません。
初期化構造体の非共有データ メンバの値を宣言の一部として初期化することはできません。構造体のパラメータ化されたコンストラクタを使ってそのようなデータ メンバを初期化するか、または構造体のインスタンスを作成した後にメンバに値を割り当てる必要があります。
**継承。**構造体は、ValueType 以外の型を継承できません。すべての構造体が、この型を継承します。特に、構造体は別の構造体を継承できません。
たとえ ValueType を指定するためであっても、Inherits ステートメント を構造体の定義で使用することはできません。
**実装。**構造体で Implements ステートメント を使用する場合、interfacenames に指定するすべてのインターフェイスに定義されたすべてのメンバを実装する必要があります。
**既定のプロパティ。**構造体には、Default (Visual Basic) 修飾子を使って、最低でも 1 つのプロパティを既定のプロパティとして指定できます。詳細については、「既定のプロパティ」を参照してください。
動作
アクセス レベル構造体の内部では、各メンバを独自のアクセス レベルで宣言できます。既定で、すべての構造体メンバのアクセス レベルは Public (Visual Basic) です。構造体そのものにこれより厳しいアクセス レベルを指定した場合は、たとえアクセス修飾子を使ってメンバのアクセス レベルを調整していても、メンバへのアクセスが自動的に制限されることに注意してください。
スコープ構造体は、そこに含まれる名前空間、クラス、構造体、またはモジュールをスコープとします。
すべての構造体メンバのスコープは、構造体全体になります。
**有効期間。**構造体に有効期間はありません。ただし、構造体の各インスタンスには、他のインスタンスに依存しない独自の有効期間があります。
インスタンスの有効期間は、New (Visual Basic) 句で作成された時点で開始されます。インスタンスに含まれる変数の有効期間が終わった時点で、そのインスタンスの有効期間は終わります。
構造体インスタンスの有効期間を延長することはできません。静的構造体に相当する機能は、モジュールに用意されています。詳細については、「Module ステートメント」を参照してください。
構造体メンバの有効期間は、それを宣言する方法と場所で決まります。詳細については、「Class ステートメント (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
参照
処理手順
方法 : ユーザー定義型を Visual Basic の構造体に変換する
概念
アップグレードに関する推奨事項 : ユーザー定義型における配列および固定長文字列の不使用