关于枚举

简短说明

语句 enum 用于声明枚举。 枚举是一种非重复类型,它由一组名为枚举器列表的命名标签组成。

详细说明

语句 enum 允许创建一组强类型标签。 该枚举可以在代码中使用,而无需分析或检查拼写错误。

枚举在内部表示为整数,起始值为零。 为列表中的第一个标签分配值零。 其余标签分配有连续数字。

在定义中,可以为标签提供任何整数值。 未分配值的标签采用下一个整数值。

语法 (基本)

enum <enum-name> {
    <label> [= <int-value>]
    ...
}

用例

以下示例演示可视为媒体文件的 对象的枚举。 定义将显式值分配给 、、 picturevideo的基础值music。 紧跟在显式赋值之后的标签将获取下一个整数值。 可以通过将相同的值分配给另一个标签来创建同义词;请参阅的构造值:oggogamogg、 或 jpgjpeg、 或 mpgmpeg

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 被提及在“获取名称”结果下,而不是在 、 jpegmpegmpg的“获取值”类似输出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中的 DeviceArchive 属性。

PS > ($file2 -band [FileAttributes]::Device) -eq [FileAttributes]::Device
True

PS > ($file2 -band [FileAttributes]::Archive) -eq [FileAttributes]::Archive
False