Condividi tramite


informazioni_su_Enum

Breve descrizione

L'istruzione enum viene utilizzata per dichiarare un'enumerazione. Un'enumerazione è un tipo distinto costituito da un set di etichette denominate denominato elenco enumeratore.

Descrizione lunga

L'istruzione enum consente di creare un set di etichette fortemente tipizzato. Tale enumerazione può essere utilizzata nel codice senza dover analizzare o verificare la presenza di errori di ortografia.

Le enumerazioni sono rappresentate internamente come numeri interi con un valore iniziale pari a zero. Alla prima etichetta dell'elenco viene assegnato il valore zero. Alle etichette rimanenti vengono assegnati numeri progressivi.

Nella definizione, alle etichette può essere assegnato qualsiasi valore intero. Le etichette senza valore assegnato accettano il valore intero successivo.

Sintassi (di base)

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

Esempio di utilizzo

Nell'esempio seguente viene illustrata un'enumerazione di oggetti che possono essere visualizzati come file multimediali. La definizione assegna valori espliciti ai valori sottostanti di music, picture, video. Le etichette immediatamente successive a un'assegnazione esplicita ottengono il valore intero successivo. I sinonimi possono essere creati assegnando lo stesso valore a un'altra etichetta; Vedere i valori costruiti per: ogg, oga, mogg, o 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
}

Il metodo GetEnumNames() restituisce l'elenco delle etichette per l'enumerazione .

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

Il metodo GetEnumValues() restituisce l'elenco dei valori per l'enumerazione .

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

Annotazioni

GetEnumNames() e GetEnumValues() sembrano restituire gli stessi risultati; elenco di valori denominati. Tuttavia, internamente, GetEnumValues() enumera i valori, quindi esegue il mapping dei valori in nomi. Leggere attentamente l'elenco e si noterà che ogg, ogae mogg vengono visualizzati nell'output di GetEnumNames(), ma l'output di GetEnumValues() mostra solo oga. La stessa cosa accade per jpg, jpege mpg, mpeg.

Il GetEnumName() metodo può essere utilizzato per ottenere un nome associato a un valore specifico. Se a un valore sono associati più nomi, il metodo restituisce il nome in ordine alfabetico.

[MediaTypes].GetEnumName(15)
oga

Nell'esempio seguente viene illustrato come eseguire il mapping di ogni nome al relativo valore.

[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

Enumerazioni come flag

Le enumerazioni possono essere definite come una raccolta di flag di bit. Dove, in un dato momento, l'enumerazione rappresenta uno o più di tali flag attivati.

Affinché le enumerazioni come flag funzionino correttamente, ogni etichetta deve avere una potenza di due valori.

Sintassi (flag)

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

Esempio di utilizzo delle bandiere

Nell'esempio seguente viene creata l'enumerazione 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

Per verificare che sia impostata una specifica, è possibile utilizzare l'operatore -banddi confronto binario . In questo esempio, viene verificato l'attributo Device e Archive nel valore di $file2.

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

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