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 ブロックを終了します。

Remarks

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

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

  • 数の入れ替えや入力間違いによるエラーを減らせます。

  • 値を後で変更しやすくなります。

  • コードが読みやすくなり、コードにエラーが生じる可能性を抑えられます。

  • 上位互換性を確保できます。 列挙型を使用すると、今後メンバー名に対応する値が変更された場合に、コードでエラーが発生する確率が低くなります。

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

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

メンバー列挙型には、クラス、構造体、モジュール、またはインターフェイス内のどこからでもアクセスできます。 クラス、構造体、またはモジュールの外部のコードでは、メンバー列挙型の名前を、そのクラス、構造体、またはモジュールの名前で修飾する必要があります。 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 などの変換キーワードを使用できます。 定数 String または Char 引数でそれを呼び出す場合は、コンパイル時に評価できるため、AscW を使用することもできます。

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

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

修飾子

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

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

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

複数の値の割り当て

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

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

例 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

関連項目