关于枚举
简短说明
语句 enum
用于声明枚举。 枚举是一种非重复类型,它由一组名为枚举器列表的命名标签组成。
详细说明
语句 enum
允许创建一组强类型标签。 该枚举可以在代码中使用,而无需分析或检查拼写错误。
枚举在内部表示为整数,起始值为零。 为列表中的第一个标签分配值零。 其余标签分配有连续数字。
在定义中,可以为标签提供任何整数值。 未分配值的标签采用下一个整数值。
语法 (基本)
enum <enum-name> {
<label> [= <int-value>]
...
}
用例
以下示例演示可视为媒体文件的 对象的枚举。 定义将显式值分配给 、、 picture
video
的基础值music
。 紧跟在显式赋值之后的标签将获取下一个整数值。 可以通过将相同的值分配给另一个标签来创建同义词;请参阅的构造值:ogg
、oga
、mogg
、 或 jpg
、jpeg
、 或 mpg
。 mpeg
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