Visual Basic .NET Language
Enum
Suche…
Aufzählungsdefinition
Ein Enum ist eine Menge logisch verwandter Konstanten.
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
Member-Initialisierung
Jedes Enumerationsmitglied kann mit einem Wert initialisiert werden. Wenn für ein Element kein Wert angegeben ist, wird der Standardwert auf 0 gesetzt (wenn es das erste Mitglied in der Mitgliederliste ist) oder auf einen Wert, der um 1 größer ist als der Wert des vorhergehenden Mitglieds.
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
Das Attribut Flags
Mit dem Attribut <Flags>
wird die Aufzählung zu einer Gruppe von Flags. Dieses Attribut ermöglicht das Zuweisen mehrerer Werte zu einer Aufzählungsvariablen. Die Mitglieder einer Flag-Enum sollten mit Potenzen von 2 (1, 2, 4, 8 ...) initialisiert werden.
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 ()
Mit der HasFlag()
-Methode kann HasFlag()
werden, ob ein Flag gesetzt ist.
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
Weitere Informationen zum Flags-Attribut und seiner Verwendung finden Sie in der offiziellen Microsoft-Dokumentation .
String-Analyse
Eine Enum-Instanz kann erstellt werden, indem eine Zeichenfolgendarstellung des Enums analysiert wird.
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
Siehe auch: Eine Zeichenfolge in einen Enum-Wert in VB.NET parsen
GetNames ()
Gibt die Namen der Konstanten im angegebenen Enum als String-Array zurück:
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
Ausgabe:
Klein
Mittel
Groß
GetValues ()
"Diese Methode ist hilfreich für das Durchlaufen von Enum-Werten."
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
Drucke:
1
2
4
ToString ()
Die ToString
Methode für eine Aufzählung gibt den Namen der Aufzählung zurück. Zum Beispiel:
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
Wenn jedoch die Zeichenfolgendarstellung des tatsächlichen Ganzzahlwerts der Aufzählung gewünscht wird, können Sie die Aufzählung in eine Integer
ToString
und ToString
:
Dim shirtSize As Size = Size.Medium
Dim output As String = CInt(shirtSize).ToString()
Console.WriteLine(output) ' Writes "1"
Bestimmen Sie, ob für ein Enum FlagsAttribute angegeben wurde oder nicht
Das nächste Beispiel kann verwendet werden, um zu bestimmen, ob für eine Enumeration FlagsAttribute angegeben wurde. Die angewandte Methodik basiert auf Reflection .
Dieses Beispiel ergibt ein True
Ergebnis:
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)
Dieses Beispiel liefert ein False
Ergebnis:
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)
Wir können eine generische Nutzungserweiterungsmethode wie diese entwerfen:
<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
Verwendungsbeispiel:
Dim result As Boolean = (New FileAttributes).HasFlagsAttribute()
For-Each-Flag (Flag-Iteration)
In einigen sehr spezifischen Szenarien würden wir die Notwendigkeit sehen, für jedes Flag der Quellenzählung eine spezifische Aktion auszuführen.
Wir können eine einfache generische Erweiterungsmethode schreiben, um diese Aufgabe zu realisieren.
<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
Verwendungsbeispiel:
Dim flags As FileAttributes = (FileAttributes.ReadOnly Or FileAttributes.Hidden)
flags.ForEachFlag(Of FileAttributes)(
Sub(ByVal x As FileAttributes)
Console.WriteLine(x.ToString())
End Sub)
Bestimmen Sie die Anzahl der Flags in einer Flagkombination
Das nächste Beispiel soll die Anzahl der Flags in der angegebenen Flagkombination zählen.
Das Beispiel wird als Erweiterungsmethode bereitgestellt:
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Function CountFlags(ByVal sender As [Enum]) As Integer
Return sender.ToString().Split(","c).Count()
End Function
Verwendungsbeispiel:
Dim flags As FileAttributes = (FileAttributes.Archive Or FileAttributes.Compressed)
Dim count As Integer = flags.CountFlags()
Console.WriteLine(count)
Finden Sie den nächsten Wert in einer Aufzählung
Der nächste Code veranschaulicht, wie der nächste Wert einer Aufzählung ermittelt wird .
Zuerst definieren wir dieses Enum , das zur Angabe von Suchkriterien (Suchrichtung) dient.
Public Enum EnumFindDirection As Integer
Nearest = 0
Less = 1
LessOrEqual = 2
Greater = 3
GreaterOrEqual = 4
End Enum
Und jetzt implementieren wir den Suchalgorithmus:
<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
Verwendungsbeispiel:
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)