Compartilhar via


Sobre o Enum

DESCRIÇÃO BREVE

A enum instrução é usada para declarar uma enumeração. Uma enumeração é um tipo distinto que consiste em um conjunto de rótulos nomeados chamado lista de enumeradores.

DESCRIÇÃO LONGA

A instrução enum permite que você crie um conjunto fortemente tipado de rótulos. Essa enumeração pode ser usada no código sem precisar analisar ou verificar se há erros de ortografia.

As enumerações são representadas internamente como inteiros com um valor inicial de zero. O primeiro rótulo da lista recebe o valor zero. Os rótulos restantes são atribuídos com números consecutivos.

Na definição, os rótulos podem receber qualquer valor inteiro. Rótulos sem valor atribuído levam o próximo valor inteiro.

Sintaxe (básica)

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

Exemplo de utilização

O exemplo a seguir mostra uma enumeração de objetos que podem ser vistos como arquivos de mídia. A definição atribui valores explícitos aos valores subjacentes de music, picture, video. Os rótulos imediatamente após uma atribuição explícita obtêm o próximo valor inteiro. Os sinônimos podem ser criados atribuindo o mesmo valor a outro rótulo; Veja os valores construídos para: ogg, oga, mogg, , jpgou mpg, jpegmpeg, , .

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
}

O método GetEnumNames() retorna a lista dos rótulos para a enumeração.

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

O método GetEnumValues() retorna a lista dos valores para a enumeração.

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

Observação: GetEnumNames() e GetEnumValues() parecem retornar os mesmos resultados. No entanto, internamente, o PowerShell está alterando valores em rótulos. Leia a lista com atenção e você notará que oga e mogg são mencionados nos resultados de 'Obter nomes', mas não na saída semelhante de 'Obter valores' para jpg, jpeg, e 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

Enumerações como sinalizadores

As enumerações podem ser definidas como uma coleção de sinalizadores de bits. Onde, em qualquer ponto, a enumeração representa um ou mais desses sinalizadores ativados.

Para que as enumerações como sinalizadores funcionem corretamente, cada rótulo deve ter uma potência de dois valores.

Sintaxe (sinalizadores)

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

Exemplo de uso de sinalizadores

No exemplo a seguir, a enumeração FileAttributes é criada.

[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 testar se um específico está definido, você pode usar o operador -bandde comparação binária . Neste exemplo, testamos os atributos Device e Archive no valor de $file2.

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

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