Udostępnij za pośrednictwem


about_Enum

Krótki opis

Instrukcja enum służy do deklarowania wyliczenia. Wyliczenie jest odrębnym typem, który składa się z zestawu nazwanych etykiet nazywanych listą modułów wyliczających.

Długi opis

Instrukcja enum umożliwia utworzenie silnie typizowanego zestawu etykiet. Tego wyliczenia można użyć w kodzie bez konieczności analizowania lub sprawdzania błędów pisowni.

Wyliczenia są wewnętrznie reprezentowane jako liczby całkowite z wartością początkową zero. Pierwsza etykieta na liście ma przypisaną wartość zero. Pozostałe etykiety są przypisywane z kolejnymi numerami.

W definicji etykiety mogą mieć dowolną wartość całkowitą. Etykiety bez przypisanej wartości przyjmują następną wartość całkowitą.

Składnia (podstawowa)

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

Przykład użycia

W poniższym przykładzie przedstawiono wyliczenie obiektów, które można postrzegać jako pliki multimedialne. Definicja przypisuje jawne wartości do podstawowych wartości , music, picturevideo. Etykiety natychmiast po jawnym przypisaniu otrzymują następną wartość całkowitą. Synonimy można utworzyć, przypisując tę samą wartość do innej etykiety; Zobacz skonstruowane wartości dla: ogg, , ogamogglub 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
}

Metoda GetEnumNames() zwraca listę etykiet dla wyliczenia.

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

Metoda GetEnumValues() zwraca listę wartości wyliczenia.

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

Uwaga

GetEnumNames() i GetEnumValues() wydaje się zwracać te same wyniki; lista nazwanych wartości. Jednak wewnętrznie wylicza wartości, GetEnumValues() a następnie mapuje wartości na nazwy. Uważnie przeczytaj listę i zauważysz, że oggelement , ogai mogg pojawi się w danych wyjściowych polecenia GetEnumNames(), ale dane wyjściowe GetEnumValues() są wyświetlane ogatylko . Dzieje się tak samo w przypadku jpg, jpegi mpg, mpeg.

Metoda GetEnumName() może służyć do pobierania nazwy skojarzonej z określoną wartością. Jeśli istnieje wiele nazw skojarzonych z wartością, metoda zwraca alfabetycznie imię.

[MediaTypes].GetEnumName(15)
oga

W poniższym przykładzie pokazano, jak zamapować każdą nazwę na jej wartość.

[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

Wyliczenie jako flagi

Wyliczenia można zdefiniować jako kolekcję flag bitowych. Gdzie w dowolnym momencie wyliczenie reprezentuje co najmniej jedną z tych flag włączonych.

Aby wyliczenie jako flagi działały prawidłowo, każda etykieta powinna mieć moc dwóch wartości.

Składnia (flagi)

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

Przykład użycia flag

W poniższym przykładzie utworzono wyliczenie 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

Aby przetestować, czy określony element jest ustawiony, możesz użyć operatora -bandporównania binarnego . W tym przykładzie testujemy atrybuty Urządzenie i Archiwum w wartości .$file2

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

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