Share via


Acerca de Enum

DESCRIPCIÓN BREVE

La enum instrucción se usa para declarar una enumeración. Una enumeración es un tipo distinto que consta de un conjunto de etiquetas con nombre denominada lista de enumeradores.

DESCRIPCIÓN LARGA

La enum instrucción permite crear un conjunto fuertemente tipado de etiquetas. Esa enumeración se puede usar en el código sin tener que analizar ni comprobar si hay errores ortográficos.

Las enumeraciones se representan internamente como enteros con un valor inicial de cero. A la primera etiqueta de la lista se le asigna el valor cero. Las etiquetas restantes se asignan con números consecutivos.

En la definición, las etiquetas se pueden asignar a cualquier valor entero. Las etiquetas sin ningún valor asignado toman el siguiente valor entero.

Sintaxis (básica)

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

Ejemplo de uso

En el ejemplo siguiente se muestra una enumeración de objetos que se pueden ver como archivos multimedia. La definición asigna valores explícitos a los valores subyacentes de music, picture, video. Las etiquetas inmediatamente después de una asignación explícita obtienen el siguiente valor entero. Los sinónimos se pueden crear asignando el mismo valor a otra etiqueta; vea los valores construidos para: ogg, oga, moggo jpg, jpego 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
}

El GetEnumNames() método devuelve la lista de las etiquetas de la enumeración.

[MediaTypes].GetEnumNames()
unknown
music
mp3
aac
ogg
oga
mogg
picture
jpg
jpeg
png
video
mpg
mpeg
avi
m4v

El GetEnumValues() método devuelve la lista de los valores de la enumeración.

[MediaTypes].GetEnumValues()
unknown
music
mp3
aac
oga
oga
oga
picture
jpeg
jpeg
png
video
mpeg
mpeg
avi
m4v

Nota: GetEnumNames() y GetEnumValues() parecen devolver los mismos resultados. Sin embargo, internamente, PowerShell cambia los valores en etiquetas. Lea la lista cuidadosamente y observará que oga y mogg se mencionan en los resultados de "Obtener nombres", pero no en la salida similar "Obtener valores" para jpg, jpegy mpg, mpeg.

[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

Enumeraciones como marcas

Las enumeraciones se pueden definir como una colección de marcas de bits. Donde, en cualquier punto dado, la enumeración representa una o varias de esas marcas activadas.

Para que las enumeraciones como marcas funcionen correctamente, cada etiqueta debe tener una potencia de dos valores.

Sintaxis (marcas)

[Flags()] enum <enum-name> {
    <label 0> [= 1]
    <label 1> [= 2]
    <label 2> [= 4]
    <label 3> [= 8]
    ...
}

Ejemplo de uso de marcas

En el ejemplo siguiente, se crea la enumeración 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

Para probar que se establece un específico, puede usar el operador -bandde comparación binaria . En este ejemplo, se prueban los atributos Device y Archive en el valor de $file2.

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

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