關於列舉
簡短描述
語句 enum
用來宣告列舉。 列舉是一種相異的類型,由一組名為 列舉值清單的具名標籤所組成。
詳細描述
enum
語句可讓您建立強型別標籤。 該列舉可以在程序代碼中使用,而不需要剖析或檢查拼字錯誤。
列舉在內部以整數表示,其起始值為零。 清單中的第一個標籤會指派零值。 其餘標籤會以連續的數位指派。
在定義中,標籤可以指定任何整數值。 未指派任何值的標籤會採用下一個整數值。
語法 (基本)
enum <enum-name> {
<label> [= <int-value>]
...
}
使用範例
下列範例顯示可視為媒體檔案的物件列舉。 定義會將明確值指派給 、、 picture
video
的基礎值music
。 緊接在明確指派後面的標籤會取得下一個整數值。 同義字可以藉由將相同的值指派給另一個標籤來建立;請參閱 的建構值:、、、 或jpeg
jpg
、 或 mpg
mpeg
mogg
oga
ogg
enum MediaTypes {
unknown
music = 10
mp3
aac
ogg = 15
oga = 15
mogg = 15
picture = 20
jpg
jpeg = 21
png
video = 40
mpg
mpeg = 41
avi
m4v
}
方法 GetEnumNames()
會傳回列舉的標籤清單。
[MediaTypes].GetEnumNames()
unknown
music
mp3
aac
ogg
oga
mogg
picture
jpg
jpeg
png
video
mpg
mpeg
avi
m4v
方法 GetEnumValues()
會傳回列舉值的清單。
[MediaTypes].GetEnumValues()
unknown
music
mp3
aac
oga
oga
oga
picture
jpeg
jpeg
png
video
mpeg
mpeg
avi
m4v
注意:GetEnumNames () 和 GetEnumValues () 似乎傳回相同的結果。
不過,在內部,PowerShell 正在將值變更為標籤。 仔細閱讀清單,您會注意到 和 oga
mogg
會在 [取得名稱] 結果底下提及,但不會在 、 jpeg
和 mpeg
mpg
的類似輸出jpg
下提及。
[MediaTypes].GetEnumName(15)
oga
[MediaTypes].GetEnumNames() | ForEach-Object {
"{0,-10} {1}" -f $_,[int]([MediaTypes]::$_)
}
unknown 0
music 10
mp3 11
aac 12
ogg 15
oga 15
mogg 15
picture 20
jpg 21
jpeg 21
png 22
video 40
mpg 41
mpeg 41
avi 42
m4v 43
列舉作為旗標
列舉可以定義為位旗標的集合。 其中,列舉在任何指定點代表開啟的一或多個旗標。
若要將列舉當做旗標正常運作,每個標籤都應該有兩個值的乘冪。
語法 (旗標)
[Flags()] enum <enum-name> {
<label 0> [= 1]
<label 1> [= 2]
<label 2> [= 4]
<label 3> [= 8]
...
}
旗標使用範例
在下列範例中,會建立 FileAttributes 列舉。
[Flags()] enum FileAttributes {
Archive = 1
Compressed = 2
Device = 4
Directory = 8
Encrypted = 16
Hidden = 32
}
[FileAttributes]$file1 = [FileAttributes]::Archive
[FileAttributes]$file1 +=[FileAttributes]::Compressed
[FileAttributes]$file1 += [FileAttributes]::Device
"file1 attributes are: $file1"
[FileAttributes]$file2 = [FileAttributes]28 ## => 16 + 8 + 4
"file2 attributes are: $file2"
file1 attributes are: Archive, Compressed, Device
file2 attributes are: Device, Directory, Encrypted
若要測試是否已設定特定,您可以使用二進位比較運算子 -band
。 在此範例中,我們會在的值$file2
中測試 Device 和 Archive 屬性。
PS > ($file2 -band [FileAttributes]::Device) -eq [FileAttributes]::Device
True
PS > ($file2 -band [FileAttributes]::Archive) -eq [FileAttributes]::Archive
False