共用方式為


Enum 陳述式 (Visual Basic)

宣告列舉型別並定義其成員值。

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

組件

組件

描述

attributelist

選擇項。 套用至這個列舉型別的屬性 (Attribute) 清單。 您必須將屬性清單在角括弧中 ("<"和">")。

FlagsAttribute屬性表示此列舉型別的執行個體的值可包含多個列舉型別成員,而且每個成員表示在列舉型別值的位元欄位。

accessmodifier

選擇項。 表示哪些程式碼可以存取這個列舉型別, 可以是下列其中一項:

您可以指定 Protected Friend 即可允許列舉型別的類別、衍生類別或相同組件內的程式碼存取列舉型別。

Shadows

選擇項。 表示此列舉型別會重新宣告並隱藏基底類別中相同具名的程式設計項目,這個項目即為多載項目集。 您只能針對列舉型別本身指定 Shadows,而不能針對它的任一成員指定這個項目。

enumerationname

必要項。 列舉型別的名稱。 如需有效名稱的詳細資訊,請參閱宣告項目名稱 (Visual Basic)

datatype

選擇項。 列舉型別及其所有成員的資料型別。

memberlist

必要項。 這個陳述式 (Statement) 中要宣告的成員常數清單。 如果有多個成員時,成員要放在個別的原始程式碼行。

每個 member 都具有下列語法和參數:[<attribute list>] member name [ = initializer ]

組件描述
membername 必要項。這個成員的名稱。
initializer 選擇項。在編譯時期評估並指派給這個成員的運算式。

End Enum

結束 Enum 區塊。

備註

如果有一組不會變動的值彼此間有邏輯上的相關性,您可以將它們一起定義在列舉型別中。 這麼做可以為列舉型別及其成員提供有意義的名稱,而這些名稱會比它們原本的值更好記。 然後,您就可以在程式碼中的許多地方使用這些列舉型別成員。

使用列舉型別的好處包括下列各項:

  • 減少因調換或輸錯數字造成的錯誤。

  • 將來更容易變更值。

  • 讓程式碼易於閱讀,這表示比較不可能的錯誤將介紹。

  • 確保向前相容性 (Forward Compatibility)。 如果您使用列舉型別時,您的程式碼是更不容易故障如果將來有人變更對應於成員名稱的值。

列舉型別都有名稱、 基礎的資料型別與成員集。 每個成員代表一個常數。

在類別、 結構、 模組或介面的層級中,任何程序之外宣告列舉型別是成員列舉型別的。 它是一個成員的類別、 結構、 模組或介面宣告它。

成員列舉型別可以從任何地方內存取類別、 結構、 模組或介面。 類別、結構或模組外的程式碼必須以該類別、結構或模組的名稱,限定成員列舉型別的名稱。 您可以不需要使用完整限定的名稱加上匯入陳述式之原始程式檔。

在命名空間層級,以外任何類別、 結構、 模組或介面宣告列舉型別是所在的命名空間的成員。

宣告內容的列舉型別必須是原始程式檔、 命名空間、 類別、 結構、 模組或介面,且不能是程序。 如需詳細資訊,請參閱宣告內容和預設存取層級 (Visual Basic)

屬性可以套用到整個列舉型別,但是無法單獨套用到列舉型別的成員。 屬性會提供資訊給組件的中繼資料 (Metadata)。

資料型別

Enum 陳述式可以宣告列舉型別的資料型別。 每個成員都會採用列舉型別的資料型別。 可以指定的型別有 Byte、Integer、Long、SByte、Short、UInteger、ULong 或 UShort。

如果沒有為列舉型別指定 datatype,則每個成員都會採用其 initializer 的資料型別。 如果同時指定 datatype 和 initializer,則 initializer 的資料型別必須可以轉換為 datatype。 如果既不指定 datatype,也不指定 initializer,則資料型別會預設值為 Integer。

初始化成員

Enum 陳述式可以初始化 memberlist 中選取成員的內容。 您可以使用 initializer 提供要指派的運算式給成員。

如果沒有指定成員的 initializer,Visual Basic 會將其初始化成零 (如果它是 memberlist 中的第一個 member),或是比前一個緊鄰的 member 值大的值。

每個 initializer 中提供的運算式,可以是常值 (Literal)、其他已經定義的常數,以及已經定義的列舉型別成員 (包含這個列舉型別中前面的成員) 的任何組合。 您可以利用算術和邏輯運算子 (Logical Operator) 來結合這樣的項目。

在 initializer 中不能使用變數或函式。 但是,您可以使用轉換關鍵字,例如 CByte 和 CShort。 如果您使用常數 String 或 Char 引數來呼叫,也可以使用 AscW,因為可以在編譯時期進行評估。

列舉不能有浮點數值。 如果成員被指派為浮點數值和Option Strict設為啟動,就會發生編譯器錯誤。 如果Option Strict是關閉的值會自動轉換為Enum型別。

如果成員的值超出基礎資料型別所允許的範圍,或者如果將任何成員初始化為基礎資料型別所允許的最大值,編譯器便會報告錯誤。

修飾詞

類別、結構、模組和介面的成員列舉型別預設為公用存取, 您可以使用存取修飾詞調整存取層級。 命名空間的成員列舉型別預設值為 friend 存取, 您可以將其存取層級調整為 public,但不能為 private 或 protected。 如需詳細資訊,請參閱 Visual Basic 中的存取層級

所有的列舉型別成員都具有公用存取,但您無法針對它們使用任何的存取修飾詞。 然而,如果列舉型別本身具有較嚴格的存取層級限制,則會優先採用指定的列舉型別存取層級。

根據預設,所有列舉型別都是型別,而其欄位都是常數。 因此,在宣告列舉型別或其成員時,無法使用 Shared、Static 和 ReadOnly 關鍵字。

將數個數值

列舉型別通常代表互斥的值。 藉由加入FlagsAttribute屬性上Enum的宣告中,您可以改指派多個值給列舉型別的執行個體。 FlagsAttribute屬性會指定列舉型別視為位元欄位,也就是一組旗標。 這些就是位元列舉型別。

當您宣告列舉型別使用FlagsAttribute屬性,建議您使用的是第 2、 1、 2、 4、 8、 16,等等,次方值。 此外,我們也建議您 「 無 」 為的成員,其值為 0 的名稱。 其他指導方針,請參閱FlagsAttributeEnum

範例

下列範例示範如何使用Enum陳述式。 請注意,該成員就是EggSizeEnum.Medium,而不是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

下列範例所示的方法是外Egg類別。 因此, EggSizeEnum是做為完整的Egg.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

下列範例使用 Enum 陳述式定義一組相關的具名常數值。 在這個例子中,這些值代表您在設計資料庫的資料輸入表單時可以選擇的色彩。

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

下列範例顯示同時包含正數和負數的一組值。

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

在下列範例中, As子句用來指定datatype的列舉型別。

Public Enum MyEnum As Byte
  Zero
  One
  Two
End Enum

下列範例會示範如何使用位元的列舉型別。 可以指派多個值的位元的列舉型別執行個體。 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

下列範例會逐一查看列舉型別。 它會使用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

請參閱

參考

Enum

Const 陳述式 (Visual Basic)

Dim 陳述式 (Visual Basic)

型別轉換函式 (Visual Basic)

AscW

概念

隱含和明確轉換 (Visual Basic)

常數和列舉型別 (Visual Basic)