Structure ステートメントStructure Statement

構造体の名前を宣言し、構造体を構成する変数、プロパティ、イベント、およびプロシージャの定義を提供します。Declares the name of a structure and introduces the definition of the variables, properties, events, and procedures that the structure comprises.

構文Syntax

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

指定項目Parts

用語Term 定義Definition
attributelist 任意。Optional. 属性リスト」を参照してください。See Attribute List.
accessmodifier 任意。Optional. 次のいずれかになります。Can be one of the following:

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

Visual Basic でのアクセス レベル」を参照してください。See Access levels in Visual Basic.
Shadows 任意。Optional. Shadows」を参照してください。See Shadows.
Partial 任意。Optional. 構造体の部分定義を示します。Indicates a partial definition of the structure. Partial」を参照してください。See Partial.
name 必須。Required. この構造体の名前です。Name of this structure. 宣言された要素の名前」を参照してください。See Declared Element Names.
Of 任意。Optional. これがジェネリックな構造体であることを指定します。Specifies that this is a generic structure.
typelist Ofキーワードを使用する場合は必須です。Required if you use the Of keyword. この構造体の型パラメーター リストを指定します。List of type parameters for this structure. 型リストを参照してください。See Type List.
Implements 任意。Optional. この構造体が、複数のインターフェイスのメンバーを実装していることを示します。Indicates that this structure implements the members of one or more interfaces. Implements ステートメント」を参照してください。See Implements Statement.
interfacenames Implements ステートメントを使用する場合は必ず指定します。Required if you use the Implements statement. この構造体が実装するインターフェイスの名前を指定します。The names of the interfaces this structure implements.
datamemberdeclarations 必須。Required. 構造体のデータメンバーを宣言する、0個以上の ConstDimEnum、または Event ステートメント。Zero or more Const, Dim, Enum, or Event statements declaring data members of the structure.
methodmemberdeclarations 任意。Optional. 構造体のメソッドメンバーとして機能する、FunctionOperatorProperty、または Sub の各プロシージャの、0個以上の宣言。Zero or more declarations of Function, Operator, Property, or Sub procedures, which serve as method members of the structure.
End Structure 必須。Required. Structure の定義を終了します。Terminates the Structure definition.

コメントRemarks

Structure ステートメントは、カスタマイズできる複合値型を定義します。The Structure statement defines a composite value type that you can customize. 構造体は、以前のバージョンの Visual Basic のユーザー定義型 (UDT) を一般化したものです。A structure is a generalization of the user-defined type (UDT) of previous versions of Visual Basic. 詳細については、「構造体」を参照してください。For more information, see Structures.

構造体は、クラスと同じ機能の多くをサポートします。Structures support many of the same features as classes. たとえば、構造体は、プロパティやプロシージャを持つことができ、インターフェイスを実装でき、パラメーター化されたコンストラクターを持つことができます。For example, structures can have properties and procedures, they can implement interfaces, and they can have parameterized constructors. ただし、継承、宣言、および使用方法に関しては、構造体とクラスの間には大きな違いがあります。However, there are significant differences between structures and classes in areas such as inheritance, declarations, and usage. また、クラスは参照型ですが、構造体は値型です。Also, classes are reference types and structures are value types. 詳細については、「構造体とクラス」を参照してください。For more information, see Structures and Classes.

Structure は、名前空間またはモジュール レベルでのみ使用できます。You can use Structure only at namespace or module level. つまり、構造体の宣言コンテキストは、ソースファイル、名前空間、クラス、構造体、モジュール、またはインターフェイスである必要があり、プロシージャまたはブロックにすることはできません。This means the declaration context for a structure must be a source file, namespace, class, structure, module, or interface, and cannot be a procedure or block. 詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。For more information, see Declaration Contexts and Default Access Levels.

構造体は、既定で Friend アクセスに設定されます。Structures default to Friend access. アクセス修飾子を使用してこれらのアクセス レベルを調整できます。You can adjust their access levels with the access modifiers. 詳細については、「Visual Basic でのアクセス レベル」を参照してください。For more information, see Access levels in Visual Basic.

ルールRules

  • 入れ子。Nesting. 構造体の内部に別の構造体を定義できます。You can define one structure within another. 外側の構造体は、包含構造体と呼ばれ、内側の構造体は入れ子構造体と呼ばれます。The outer structure is called the containing structure, and the inner structure is called a nested structure. ただし、包含構造体をとおして入れ子構造体のメンバーにアクセスすることはできません。However, you cannot access a nested structure's members through the containing structure. 入れ子構造体のメンバーにアクセスするには、入れ子構造体のデータ型の変数を宣言する必要があります。Instead, you must declare a variable of the nested structure's data type.

  • メンバー宣言。Member Declaration. 構造体のすべてのメンバーを宣言する必要があります。You must declare every member of a structure. 構造体を継承することはできないため、構造体メンバーを Protectedまたは Protected Friend できません。A structure member cannot be Protected or Protected Friend because nothing can inherit from a structure. ただし、構造体そのものをProtected または Protected Friend にすることはできます。The structure itself, however, can be Protected or Protected Friend.

    0 個または 1 つ以上の非共有変数または非共有の非カスタム イベントを構造体内で宣言することができます。You can declare zero or more nonshared variables or nonshared, noncustom events in a structure. 非共有ではあっても、定数、プロパティ、およびプロシージャだけを宣言することはできません。You cannot have only constants, properties, and procedures, even if some of them are nonshared.

  • 初期化。Initialization. 構造体の非共有データ メンバーの値を宣言の一部として初期化することはできません。You cannot initialize the value of any nonshared data member of a structure as part of its declaration. 構造体のパラメーター化されたコンストラクターを使ってそのようなデータ メンバーを初期化するか、または構造体のインスタンスを作成した後にメンバーに値を割り当てる必要があります。You must either initialize such a data member by means of a parameterized constructor on the structure, or assign a value to the member after you have created an instance of the structure.

  • 継承。Inheritance. 構造体は、ValueType 以外の型を継承できません。すべての構造体が、この型を継承します。A structure cannot inherit from any type other than ValueType, from which all structures inherit. 特に、構造体は別の構造体を継承できません。In particular, one structure cannot inherit from another.

    ValueTypeを指定する場合でも、構造体の定義でInherits ステートメントを使用することはできません。You cannot use the Inherits Statement in a structure definition, even to specify ValueType.

  • 実装。Implementation. 構造体が Implements ステートメントを使用する場合は、interfacenamesで指定するすべてのインターフェイスで定義されているすべてのメンバーを実装する必要があります。If the structure uses the Implements Statement, you must implement every member defined by every interface you specify in interfacenames.

  • 既定のプロパティ。Default Property. 構造体では、Defaultの修飾子を使用して、最大で1つのプロパティを既定のプロパティとして指定できます。A structure can specify at most one property as its default property, using the Default modifier. 詳細については、「Default」を参照してください。For more information, see Default.

動作Behavior

  • アクセスレベル。Access Level. 構造体の内部では、各メンバーを独自のアクセス レベルで宣言できます。Within a structure, you can declare each member with its own access level. すべての構造体メンバーは、既定で Publicアクセスになります。All structure members default to Public access. 構造体そのものにこれより厳しいアクセス レベルを指定した場合は、たとえアクセス修飾子を使ってメンバーのアクセス レベルを調整していても、メンバーへのアクセスが自動的に制限されることに注意してください。Note that if the structure itself has a more restricted access level, this automatically restricts access to its members, even if you adjust their access levels with the access modifiers.

  • スコープ。Scope. 構造体は、そこに含まれる名前空間、クラス、構造体、またはモジュールをスコープとします。A structure is in scope throughout its containing namespace, class, structure, or module.

    すべての構造体メンバーのスコープは、構造体全体になります。The scope of every structure member is the entire structure.

  • 有効期間。Lifetime. 構造体に有効期間はありません。A structure does not itself have a lifetime. ただし、構造体の各インスタンスには、他のインスタンスに依存しない独自の有効期間があります。Rather, each instance of that structure has a lifetime independent of all other instances.

    インスタンスの有効期間は、New 演算子 句によって作成されると開始されます。The lifetime of an instance begins when it is created by a New Operator clause. インスタンスに含まれる変数の有効期間が終わった時点で、そのインスタンスの有効期間は終わります。It ends when the lifetime of the variable that holds it ends.

    構造体インスタンスの有効期間を延長することはできません。You cannot extend the lifetime of a structure instance. 静的構造体に相当する機能は、モジュールに用意されています。An approximation to static structure functionality is provided by a module. 詳細については、「Module ステートメント」を参照してください。For more information, see Module Statement.

    構造体メンバーの有効期間は、それを宣言する方法と場所で決まります。Structure members have lifetimes depending on how and where they are declared. 詳細については、「Class ステートメント」の「有効期間」を参照してください。For more information, see "Lifetime" in Class Statement.

  • 修飾Qualification. 構造体の外部にあるコードでは、メンバーの名前をその構造体の名前で修飾する必要があります。Code outside a structure must qualify a member's name with the name of that structure.

    入れ子構造体の内部のコードでプログラミング要素を修飾なしで参照した場合、Visual Basic はその要素をまず入れ子構造体の内部で探し、その次にコンテナー構造体の内部で探します。この手順が、最も外側のコンテナー要素にまで繰り返されます。If code inside a nested structure makes an unqualified reference to a programming element, Visual Basic searches for the element first in the nested structure, then in its containing structure, and so on out to the outermost containing element. 詳細については、「宣言された要素の参照」を参照してください。For more information, see References to Declared Elements.

  • メモリ使用量。Memory Consumption. 他のすべての複合データ型と同様に、構造体の総メモリ使用量を計算する場合、各メンバーのストレージ割り当ての公称サイズを単に合計しただけでは安全ではありません。As with all composite data types, you cannot safely calculate the total memory consumption of a structure by adding together the nominal storage allocations of its members. さらに、メモリ内に格納される順序が宣言の順序と同じであると仮定するのも安全ではありません。Furthermore, you cannot safely assume that the order of storage in memory is the same as your order of declaration. 構造体のストレージ レイアウトを制御する必要がある場合は、StructLayoutAttribute 属性を Structure ステートメントに適用します。If you need to control the storage layout of a structure, you can apply the StructLayoutAttribute attribute to the Structure statement.

Example

次の例では、Structure ステートメントを使って、従業員に関連のある複数のデータを定義しています。The following example uses the Structure statement to define a set of related data for an employee. データ項目の機密性に応じて PublicFriendPrivate の各メンバーを使用する方法が示されています。It shows the use of Public, Friend, and Private members to reflect the sensitivity of the data items. プロシージャ、プロパティ、およびイベント メンバーも示されています。It also shows procedure, property, and event members.

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

Structures の使用方法の詳細については、「Structure Variable」を参照してください。For more information on how to use Structures, see Structure Variable.

関連項目See also