Visual Basic .NET Language
Enum
Szukaj…
Definicja wyliczenia
Wyliczenie to zbiór logicznie powiązanych stałych.
Enum Size
Small
Medium
Large
End Enum
Public Sub Order(shirtSize As Size)
Select Case shirtSize
Case Size.Small
' ...
Case Size.Medium
' ...
Case Size.Large
' ...
End Select
End Sub
Inicjalizacja członka
Każdy z członków enum może być inicjowany wartością. Jeśli dla członka nie określono wartości, domyślnie jest on inicjowany na 0 (jeśli jest to pierwszy członek na liście członków) lub na wartość większą o 1 niż wartość poprzedniego członka.
Module Module1
Enum Size
Small
Medium = 3
Large
End Enum
Sub Main()
Console.WriteLine(Size.Small) ' prints 0
Console.WriteLine(Size.Medium) ' prints 3
Console.WriteLine(Size.Large) ' prints 4
' Waits until user presses any key
Console.ReadKey()
End Sub
End Module
Atrybut Flagi
Dzięki atrybutowi <Flags>
wyliczenie staje się zbiorem flag. Ten atrybut umożliwia przypisanie wielu wartości zmiennej zmiennej wyliczeniowej. Członkowie enum flagi powinni być inicjowani mocami 2 (1, 2, 4, 8 ...).
Module Module1
<Flags>
Enum Material
Wood = 1
Plastic = 2
Metal = 4
Stone = 8
End Enum
Sub Main()
Dim houseMaterials As Material = Material.Wood Or Material.Stone
Dim carMaterials as Material = Material.Plastic Or Material.Metal
Dim knifeMaterials as Material = Material.Metal
Console.WriteLine(houseMaterials.ToString()) 'Prints "Wood, Stone"
Console.WriteLine(CType(carMaterials, Integer)) 'Prints 6
End Sub
End Module
HasFlag ()
Za HasFlag()
metody HasFlag()
można sprawdzić, czy ustawiona jest flaga.
Module Module1
<Flags>
Enum Material
Wood = 1
Plastic = 2
Metal = 4
Stone = 8
End Enum
Sub Main()
Dim houseMaterials As Material = Material.Wood Or Material.Stone
If houseMaterials.HasFlag(Material.Stone) Then
Console.WriteLine("the house is made of stone")
Else
Console.WriteLine("the house is not made of stone")
End If
End Sub
End Module
Aby uzyskać więcej informacji na temat atrybutu Flagi i sposobu jego użycia, zobacz oficjalną dokumentację Microsoft .
Przetwarzanie ciągu
Instancję Enum można utworzyć, analizując ciąg reprezentujący Enum.
Module Module1
Enum Size
Small
Medium
Large
End Enum
Sub Main()
Dim shirtSize As Size = DirectCast([Enum].Parse(GetType(Size), "Medium"), Size)
' Prints 'Medium'
Console.WriteLine(shirtSize.ToString())
' Waits until user presses any key
Console.ReadKey()
End Sub
End Module
Zobacz także: Przetwarzanie ciągu znaków na wartość Enum w VB.NET
GetNames ()
Zwraca nazwy stałych w określonym Enum jako tablicę ciągów:
Module Module1
Enum Size
Small
Medium
Large
End Enum
Sub Main()
Dim sizes = [Enum].GetNames(GetType(Size))
For Each size In sizes
Console.WriteLine(size)
Next
End Sub
End Module
Wynik:
Mały
Średni
Duży
GetValues ()
„Ta metoda jest przydatna do iteracji wartości Enum”
Enum Animal
Dog = 1
Cat = 2
Frog = 4
End Enum
Dim Animals = [Enum].GetValues(GetType(Animal))
For Each animal in Animals
Console.WriteLine(animal)
Next
Wydruki:
1
2)
4
ToString ()
Metoda ToString
w wyliczeniu zwraca nazwę ciągu wyliczenia. Na przykład:
Module Module1
Enum Size
Small
Medium
Large
End Enum
Sub Main()
Dim shirtSize As Size = Size.Medium
Dim output As String = shirtSize.ToString()
Console.WriteLine(output) ' Writes "Medium"
End Sub
End Module
Jeśli jednak pożądana jest reprezentacja ciągu rzeczywistej wartości całkowitej wyliczenia, można rzucić wyliczenie na liczbę Integer
a następnie wywołać ToString
:
Dim shirtSize As Size = Size.Medium
Dim output As String = CInt(shirtSize).ToString()
Console.WriteLine(output) ' Writes "1"
Sprawdź, czy Enum ma FlagsAttribute, czy nie
Następnego przykładu można użyć do ustalenia, czy wyliczenie ma określony parametr FlagsAttribute . Zastosowana metodologia oparta jest na Refleksji .
Ten przykład da True
wynik:
Dim enu As [Enum] = New FileAttributes()
Dim hasFlags As Boolean = enu.GetType().GetCustomAttributes(GetType(FlagsAttribute), inherit:=False).Any()
Console.WriteLine("{0} Enum has FlagsAttribute?: {1}", enu.GetType().Name, hasFlags)
Ten przykład da False
wynik:
Dim enu As [Enum] = New ConsoleColor()
Dim hasFlags As Boolean = enu.GetType().GetCustomAttributes(GetType(FlagsAttribute), inherit:=False).Any()
Console.WriteLine("{0} Enum has FlagsAttribute?: {1}", enu.GetType().Name, hasFlags)
Możemy zaprojektować ogólną metodę rozszerzenia użycia, taką jak ta:
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Function HasFlagsAttribute(ByVal sender As [Enum]) As Boolean
Return sender.GetType().GetCustomAttributes(GetType(FlagsAttribute), inherit:=False).Any()
End Function
Przykład użycia:
Dim result As Boolean = (New FileAttributes).HasFlagsAttribute()
Dla każdej flagi (iteracja flagi)
W niektórych bardzo specyficznych scenariuszach odczuwamy potrzebę wykonania określonej akcji dla każdej flagi wyliczenia źródłowego.
Możemy napisać prostą Ogólną metodę rozszerzenia, aby zrealizować to zadanie.
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Sub ForEachFlag(Of T)(ByVal sender As [Enum],
ByVal action As Action(Of T))
For Each flag As T In sender.Flags(Of T)
action.Invoke(flag)
Next flag
End Sub
Przykład użycia:
Dim flags As FileAttributes = (FileAttributes.ReadOnly Or FileAttributes.Hidden)
flags.ForEachFlag(Of FileAttributes)(
Sub(ByVal x As FileAttributes)
Console.WriteLine(x.ToString())
End Sub)
Określ liczbę flag w kombinacji flag
Następny przykład ma zliczyć liczbę flag w określonej kombinacji flag.
Przykład podano jako metodę rozszerzenia:
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Function CountFlags(ByVal sender As [Enum]) As Integer
Return sender.ToString().Split(","c).Count()
End Function
Przykład użycia:
Dim flags As FileAttributes = (FileAttributes.Archive Or FileAttributes.Compressed)
Dim count As Integer = flags.CountFlags()
Console.WriteLine(count)
Znajdź najbliższą wartość w Enum
Następny kod ilustruje, jak znaleźć najbliższą wartość Enum .
Najpierw zdefiniujemy to Enum , które posłuży do określenia kryteriów wyszukiwania (kierunek wyszukiwania)
Public Enum EnumFindDirection As Integer
Nearest = 0
Less = 1
LessOrEqual = 2
Greater = 3
GreaterOrEqual = 4
End Enum
A teraz wdrażamy algorytm wyszukiwania:
<DebuggerStepThrough>
Public Shared Function FindNearestEnumValue(Of T)(ByVal value As Long,
ByVal direction As EnumFindDirection) As T
Select Case direction
Case EnumFindDirection.Nearest
Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
Order By Math.Abs(value - Convert.ToInt64(enumValue))
).FirstOrDefault
Case EnumFindDirection.Less
If value < Convert.ToInt64([Enum].GetValues(GetType(T)).Cast(Of T).First) Then
Return [Enum].GetValues(GetType(T)).Cast(Of T).FirstOrDefault
Else
Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
Where Convert.ToInt64(enumValue) < value
).LastOrDefault
End If
Case EnumFindDirection.LessOrEqual
If value < Convert.ToInt64([Enum].GetValues(GetType(T)).Cast(Of T).First) Then
Return [Enum].GetValues(GetType(T)).Cast(Of T).FirstOrDefault
Else
Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
Where Convert.ToInt64(enumValue) <= value
).LastOrDefault
End If
Case EnumFindDirection.Greater
If value > Convert.ToInt64([Enum].GetValues(GetType(T)).Cast(Of T).Last) Then
Return [Enum].GetValues(GetType(T)).Cast(Of T).LastOrDefault
Else
Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
Where Convert.ToInt64(enumValue) > value
).FirstOrDefault
End If
Case EnumFindDirection.GreaterOrEqual
If value > Convert.ToInt64([Enum].GetValues(GetType(T)).Cast(Of T).Last) Then
Return [Enum].GetValues(GetType(T)).Cast(Of T).LastOrDefault
Else
Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
Where Convert.ToInt64(enumValue) >= value
).FirstOrDefault
End If
End Select
End Function
Przykład użycia:
Public Enum Bitrate As Integer
Kbps128 = 128
Kbps192 = 192
Kbps256 = 256
Kbps320 = 320
End Enum
Dim nearestValue As Bitrate = FindNearestEnumValue(Of Bitrate)(224, EnumFindDirection.GreaterOrEqual)