次の方法で共有


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

列挙体を宣言し、そのメンバーの値を定義します。

構文

[ <attributelist> ] [ accessmodifier ]  [ Shadows ]
Enum enumerationname [ As datatype ]
   memberlist
End Enum

部品

  • attributelist

    任意。 この列挙に適用される属性の一覧。 属性リストは山かっこ ("<" と ">") で囲む必要があります。

    FlagsAttribute属性は、列挙のインスタンスの値に複数の列挙メンバーを含めることができることを示し、各メンバーが列挙値のビット フィールドを表します。

  • accessmodifier

    任意。 この列挙型にアクセスできるコードを指定します。 次のいずれかを指定できます。

  • Shadows

    任意。 この列挙体が、基底クラスで同じ名前のプログラミング要素またはオーバーロードされた要素のセットを再宣言して非表示にすることを指定します。 Shadows は、列挙体自体でのみ指定でき、そのメンバーには指定できません。

  • enumerationname

    必須。 列挙体の名前。 有効な名前については、「 宣言された要素名」を参照してください。

  • datatype

    任意。 列挙体とそのすべてのメンバーのデータ型。

  • memberlist

    必須。 このステートメントで宣言されているメンバー定数の一覧。 複数のメンバーが個々のソース コード行に表示されます。

    member には、次の構文と部分があります。 [<attribute list>] member name [ = initializer ]

    部分 説明
    membername 必須。 このメンバーの名前。
    initializer 任意。 コンパイル時に評価され、このメンバーに割り当てられる式。
  • End Enum

    Enum ブロックを終了します。

注釈

論理的に相互に関連する一連の変更されていない値がある場合は、それらを列挙体でまとめて定義できます。 これにより、列挙体とそのメンバーにわかりやすい名前が付けられます。これは、値よりも覚えやすい名前です。 その後、コード内の多くの場所で列挙メンバーを使用できます。

列挙型を使用する利点は次のとおりです。

  • 数値の入れ替えまたは誤りによって発生するエラーを減らします。

  • 将来的に値を簡単に変更できます。

  • コードを読みやすくします。つまり、エラーが発生する可能性が低くなります。

  • 前方互換性を確保します。 列挙型を使用する場合、将来誰かがメンバー名に対応する値を変更した場合、コードが失敗する可能性は低くなります。

列挙型には、名前、基になるデータ型、およびメンバーのセットがあります。 各メンバーは定数を表します。

クラス、構造体、モジュール、またはインターフェイス レベルで宣言された列挙体は、プロシージャの外部にある メンバー列挙型です。 これは、それを宣言するクラス、構造体、モジュール、またはインターフェイスのメンバーです。

メンバー列挙型は、クラス、構造体、モジュール、またはインターフェイス内の任意の場所からアクセスできます。 クラス、構造体、またはモジュールの外部のコードでは、メンバー列挙体の名前を、そのクラス、構造体、またはモジュールの名前で修飾する必要があります。 Imports ステートメントをソース ファイルに追加することで、完全修飾名を使用する必要がなくなります。

クラス、構造体、モジュール、またはインターフェイスの外部で名前空間レベルで宣言された列挙体は、それが表示される名前空間のメンバーです。

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

列挙体全体に属性を適用できますが、個々のメンバーには適用できません。 属性は、アセンブリのメタデータに情報を提供します。

データ型

Enum ステートメントでは、列挙型のデータ型を宣言できます。 各メンバーは、列挙型のデータ型を受け取ります。 ByteIntegerLongSByteShortUIntegerULong、またはUShortを指定できます。

列挙体に datatype を指定しない場合、各メンバーはその initializerのデータ型を受け取ります。 datatypeinitializerの両方を指定する場合は、initializerのデータ型をdatatypeに変換できる必要があります。 datatypeinitializerも存在しない場合、データ型は既定で Integer になります。

メンバーの初期化

Enum ステートメントは、memberlistで選択したメンバーの内容を初期化できます。 initializerを使用して、メンバーに割り当てる式を指定します。

メンバーにinitializerを指定しない場合、Visual Basic は、メンバーを 0 に初期化するか (memberlistの最初のmemberの場合)、または直前のmemberの値より 1 つ大きい値に初期化します。

initializer で指定される式は、リテラル、既に定義されている他の定数、および既に定義されている列挙メンバー (この列挙体の前のメンバーを含む) の任意の組み合わせにすることができます。 算術演算子と論理演算子を使用して、このような要素を組み合わせることができます。

initializerで変数または関数を使用することはできません。 ただし、 CByteCShortなどの変換キーワードを使用できます。 AscWを定数StringまたはChar引数で呼び出す場合は、コンパイル時に評価できるため、使用することもできます。

列挙型は浮動小数点値を持つことはできません。 メンバーに浮動小数点値が割り当てられ、 Option Strict がオンに設定されている場合、コンパイラ エラーが発生します。 Option Strictがオフの場合、値は自動的にEnum型に変換されます。

メンバーの値が基になるデータ型の許容範囲を超えた場合、または基になるデータ型で許可される最大値にメンバーを初期化すると、コンパイラはエラーを報告します。

修飾子

クラス、構造体、モジュール、およびインターフェイス メンバーの列挙型は、既定でパブリック アクセスになります。 アクセス修飾子を使用してアクセス レベルを調整できます。 名前空間メンバーの列挙型は、既定でフレンド アクセスになります。 アクセス レベルはパブリックに調整できますが、プライベートまたは保護に対して調整することはできません。 詳細については、「 Visual Basic のアクセス レベル」を参照してください。

すべての列挙メンバーはパブリック アクセス権を持ち、それらに対してアクセス修飾子を使用することはできません。 ただし、列挙型自体のアクセス レベルが制限されている場合は、指定した列挙アクセス レベルが優先されます。

既定では、すべての列挙型は型であり、そのフィールドは定数です。 したがって、列挙体またはそのメンバーを宣言するときに、 SharedStatic、および ReadOnly キーワードを使用することはできません。

複数の値を割り当てる

列挙型は通常、相互に排他的な値を表します。 Enum宣言に FlagsAttribute 属性を含めることで、代わりに列挙のインスタンスに複数の値を割り当てることができます。 FlagsAttribute属性は、列挙体をビット フィールド、つまりフラグのセットとして扱うよう指定します。 これらは ビットごとの 列挙型と呼ばれます。

FlagsAttribute属性を使用して列挙型を宣言する場合は、値に 2 の累乗 (1、2、4、8、16 など) を使用することをお勧めします。 また、値が 0 のメンバーの名前を "None" にすることをお勧めします。 その他のガイドラインについては、「 FlagsAttributeEnum」を参照してください。

例 1

次の例は、 Enum ステートメントの使用方法を示しています。 メンバーはMediumではなく、EggSizeEnum.Mediumと呼ばれることに注意してください。

Public Class Egg
    Enum EggSizeEnum
        Jumbo
        ExtraLarge
        Large
        Medium
        Small
    End Enum

    Public Sub Poach()
        Dim size As EggSizeEnum

        size = EggSizeEnum.Medium
        ' Continue processing...
    End Sub
End Class

例 2

次の例のメソッドは、 Egg クラスの外部にあります。 したがって、 EggSizeEnumEgg.EggSizeEnumとして完全修飾されます。

Public Sub Scramble(ByVal size As Egg.EggSizeEnum)
    ' Process for the three largest sizes.
    ' Throw an exception for any other size.
    Select Case size
        Case Egg.EggSizeEnum.Jumbo
            ' Process.
        Case Egg.EggSizeEnum.ExtraLarge
            ' Process.
        Case Egg.EggSizeEnum.Large
            ' Process.
        Case Else
            Throw New ApplicationException("size is invalid: " & size.ToString)
    End Select
End Sub

例 3

次の例では、 Enum ステートメントを使用して、関連する名前付き定数値のセットを定義します。 この場合、値は、データベースのデータ入力フォームを設計するために選択できる色です。

Public Enum InterfaceColors
    MistyRose = &HE1E4FF&
    SlateGray = &H908070&
    DodgerBlue = &HFF901E&
    DeepSkyBlue = &HFFBF00&
    SpringGreen = &H7FFF00&
    ForestGreen = &H228B22&
    Goldenrod = &H20A5DA&
    Firebrick = &H2222B2&
End Enum

例 4

次の例は、正と負の両方の数値を含む値を示しています。

Enum SecurityLevel
    IllegalEntry = -1
    MinimumSecurity = 0
    MaximumSecurity = 1
End Enum

例 5

次の例では、 As 句を使用して列挙体の datatype を指定します。

Public Enum MyEnum As Byte
    Zero
    One
    Two
End Enum

例 6

次の例は、ビットごとの列挙型を使用する方法を示しています。 ビットごとの列挙型のインスタンスには、複数の値を割り当てることができます。 Enum宣言には、列挙型をフラグのセットとして扱うことができることを示すFlagsAttribute属性が含まれています。

' Apply the Flags attribute, which allows an instance
' of the enumeration to have multiple values.
<Flags()> Public Enum FilePermissions As Integer
    None = 0
    Create = 1
    Read = 2
    Update = 4
    Delete = 8
End Enum

Public Sub ShowBitwiseEnum()

    ' Declare the non-exclusive enumeration object and
    ' set it to multiple values.
    Dim perm As FilePermissions
    perm = FilePermissions.Read Or FilePermissions.Update

    ' Show the values in the enumeration object.
    Console.WriteLine(perm.ToString)
    ' Output: Read, Update

    ' Show the total integer value of all values
    ' in the enumeration object.
    Console.WriteLine(CInt(perm))
    ' Output: 6

    ' Show whether the enumeration object contains
    ' the specified flag.
    Console.WriteLine(perm.HasFlag(FilePermissions.Update))
    ' Output: True
End Sub

例 7

次の例では、列挙型を反復処理します。 GetNames メソッドを使用して列挙体からメンバー名の配列を取得し、GetValuesメンバー値の配列を取得します。

Enum EggSizeEnum
    Jumbo
    ExtraLarge
    Large
    Medium
    Small
End Enum

Public Sub Iterate()
    Dim names = [Enum].GetNames(GetType(EggSizeEnum))
    For Each name In names
        Console.Write(name & " ")
    Next
    Console.WriteLine()
    ' Output: Jumbo ExtraLarge Large Medium Small 

    Dim values = [Enum].GetValues(GetType(EggSizeEnum))
    For Each value In values
        Console.Write(value & " ")
    Next
    Console.WriteLine()
    ' Output: 0 1 2 3 4 
End Sub

こちらも参照ください