關於列舉
簡短描述
語句 enum
是用來宣告列舉。 列舉是一種相異類型,其中包含一組稱為列舉值清單的具名標籤。
詳細描述
語句 enum
可讓您建立強型別的標籤。 該列舉可以在程序代碼中使用,而不需要剖析或檢查拼字錯誤。
列舉在內部以整數表示,其起始值為零。 清單中的第一個標籤會指派為零值。 其餘標籤會以連續的數位指派。
在定義中,標籤可以指定任何整數值。 未指派任何值的標籤會採用下一個整數值。
語法 (基本)
enum <enum-name> {
<label> [= <int-value>]
...
}
使用範例
下列範例顯示可視為媒體檔案的物件列舉。 定義會將明確值指派給 、、 picture
video
的基礎值music
。 緊接在明確指派之後的標籤會取得下一個整數值。 同義字可以藉由將相同的值指派給另一個標籤來建立;請參閱 下列項目的建構值:ogg
、oga
、mogg
、 或 jpg
、 或 mpg
mpeg
jpeg
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