宣告列舉並定義其成員的值。
語法
[ <attributelist> ] [ accessmodifier ] [ Shadows ]
Enum enumerationname [ As datatype ]
memberlist
End Enum
組件
attributelist選擇性。 套用至此列舉的屬性清單。 您必須以角括弧 (“” 和 “
<”) 括住>。屬性 FlagsAttribute 表示列舉實例的值可以包含多個列舉成員,而且每個成員都代表列舉值中的位字段。
accessmodifier選擇性。 指定哪些程式代碼可以存取此列舉。 可以是下列其中一項:
Shadows選擇性。 指定這個列舉會重新宣告,並在基類中隱藏同名的程式設計專案或一組多載專案。 您只能在列舉本身上指定 Shadows ,而不是在其任何成員上。
enumerationname必須的。 列舉的名稱。 如需有效名稱的資訊,請參閱 宣告項目名稱。
datatype選擇性。 列舉及其所有成員的數據類型。
memberlist必須的。 在此語句中宣告的成員常數清單。 多個成員會出現在個別的原始程式碼行上。
每個
member都有下列語法和元件:[<attribute list>] membername [ = initializer ]部分 說明 membername必須的。 這個成員的名稱。 initializer選擇性。 在編譯階段評估並指派給這個成員的表達式。 EndEnum終止 區塊
Enum。
備註
如果您有一組邏輯上彼此相關的未變更值,您可以在列舉中一起定義這些值。 這會為列舉及其成員提供有意義的名稱,這比其值更容易記住。 接著,您可以在程式代碼的許多位置使用 列舉成員。
使用列舉的優點包括:
減少因轉置或輸入錯誤數字而造成的錯誤。
可讓您在日後輕鬆變更值。
讓程式代碼更容易閱讀,這表示將引入錯誤的可能性較小。
確保向前相容性。 如果您使用列舉,如果未來有人變更與成員名稱對應的值,則程式代碼不太可能失敗。
列舉具有名稱、基礎數據類型和一組成員。 每個成員都代表常數。
在類別、結構、模組或介面層級宣告的列舉,在任何程式之外,都是 成員列舉。 它是宣告類別、結構、模組或介面的成員。
您可以從其類別、結構、模組或介面中的任何位置存取成員列舉。 類別、結構或模組以外的程式代碼必須以該類別、結構或模組的名稱限定成員列舉的名稱。 您可以將 Imports 語句新增至原始程式檔,以避免需要使用完整名稱。
在命名空間層級宣告的列舉,在任何類別、結構、模組或介面之外,都是其出現的命名空間成員。
列舉的 宣告內容 必須是來源檔案、命名空間、類別、結構、模組或介面,而且不能是程式。 如需詳細資訊,請參閱 宣告內容和預設存取層級。
您可以將屬性套用至整體列舉,但不能個別套用至其成員。 屬性會提供元件元數據的資訊。
數據類型
語句 Enum 可以宣告列舉的數據類型。 每個成員都會採用列舉的數據類型。 您可以指定 Byte、Integer、、、LongSByteShort、UInteger、ULong、 或 UShort。
如果您未指定 datatype 列舉,則每個成員都會採用其 initializer的數據類型。 如果您同時 datatype 指定和 initializer,則的 initializer 資料類型必須可轉換成 datatype。 如果 和 都不存在datatype,數據類型會預設為 initializer。Integer
初始化成員
Enum語句可以初始化 中memberlist所選成員的內容。 您可以使用 initializer 來提供要指派給成員的表達式。
如果您未initializer指定成員,Visual Basic 會將它初始化為零(如果它是中的member第一memberlist個 ),或的值大於前member一個 的值。
每個 initializer 中提供的表達式可以是常值的任何組合、已定義的其他常數,以及已經定義的列舉成員,包括這個列舉的先前成員。 您可以使用算術和邏輯運算子來結合這類元素。
您無法在 中使用 initializer變數或函式。 不過,您可以使用 轉換關鍵字,例如 CByte 和 CShort。 如果您以常數AscW或String自變數呼叫它,您也可以使用 Char ,因為您可以在編譯時期加以評估。
列舉不能有浮點值。 如果成員已指派浮點值,且 Option Strict 設定為 on,則會發生編譯程式錯誤。 如果 Option Strict 為 off,則值會自動轉換成 Enum 類型。
如果成員的值超過基礎數據類型的允許範圍,或者如果您將任何成員初始化為基礎數據類型所允許的最大值,編譯程式就會報告錯誤。
修飾 符
類別、結構、模組和介面成員列舉預設為公用存取。 您可以使用存取修飾詞來調整其存取層級。 命名空間成員列舉預設為friend存取。 您可以將其存取層級調整為公用,但不能調整為私人或受保護。 如需詳細資訊,請參閱 Visual Basic中的存取層級。
所有列舉成員都有公用存取權,而且您無法在它們上使用任何存取修飾詞。 不過,如果列舉本身具有較受限制的存取層級,則指定的列舉存取層級優先。
根據預設,所有列舉都是類型,而且其欄位是常數。 因此, Shared宣告列舉或其成員時,無法使用、 Static和 ReadOnly 關鍵詞。
指派多個值
列舉通常代表互斥值。
FlagsAttribute藉由在宣告中包含 Enum 屬性,您可以改為將多個值指派給 列舉的實例。 屬性 FlagsAttribute 會指定列舉視為位字段,也就是一組旗標。 這些稱為 位 列舉。
當您使用 FlagsAttribute 屬性宣告列舉時,建議您針對值使用 2 的乘冪,也就是 1、2、4、8、16 等等。 我們也建議 「None」 是值為 0 的成員名稱。 如需其他指導方針,請參閱 FlagsAttribute 和 Enum。
範例 1
下列範例示範如何使用 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
範例 2
下列範例中的 方法位於 類別之外 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
範例 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