Visual Basic .NET Language
Enum
Zoeken…
Enum-definitie
Een opsomming is een set logisch gerelateerde constanten.
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
Initialisatie van leden
Elk van de opsommingsleden kan worden geïnitialiseerd met een waarde. Als er geen waarde is opgegeven voor een lid, wordt deze standaard geïnitialiseerd op 0 (als dit het eerste lid in de ledenlijst is) of op een waarde groter dan 1 dan de waarde van het voorgaande lid.
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
Het kenmerk Vlaggen
Met het attribuut <Flags>
wordt het getal een reeks vlaggen. Met dit kenmerk kunnen meerdere waarden aan een enum-variabele worden toegewezen. De leden van een vlaggenlijst moeten worden geïnitialiseerd met bevoegdheden van 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 ()
De methode HasFlag()
kan worden gebruikt om te controleren of een vlag is ingesteld.
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
Raadpleeg de officiële Microsoft-documentatie voor meer informatie over het kenmerk Flags en hoe dit moet worden gebruikt.
String parsing
Een Enum-instantie kan worden gemaakt door een tekenreeksrepresentatie van de Enum te parseren.
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
Zie ook: Parseer een string naar een Enum-waarde in VB.NET
GetNames ()
Retourneert de namen van constanten in het opgegeven Enum als een stringarray:
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
Output:
Klein
Medium
Groot
GetValues ()
'Deze methode is handig voor het herhalen van Enum-waarden'
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
prints:
1
2
4
ToString ()
De methode ToString
op een opsomming retourneert de tekenreeksnaam van de opsomming. Bijvoorbeeld:
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
Als de tekenreeksrepresentatie van de werkelijke waarde van het gehele getal echter gewenst is, kunt u het Integer
naar een geheel Integer
casten en vervolgens ToString
aanroepen:
Dim shirtSize As Size = Size.Medium
Dim output As String = CInt(shirtSize).ToString()
Console.WriteLine(output) ' Writes "1"
Bepaal of voor een Enum FlagsAttribute is opgegeven of niet
Het volgende voorbeeld kan worden gebruikt om te bepalen of voor een opsomming het FlagsAttribute is opgegeven. De gebruikte methode is gebaseerd op Reflectie .
Dit voorbeeld geeft een True
resultaat:
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)
Dit voorbeeld geeft een False
resultaat:
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)
We kunnen een generieke methode voor uitbreiding van het gebruik zoals deze ontwerpen:
<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
Gebruiksvoorbeeld:
Dim result As Boolean = (New FileAttributes).HasFlagsAttribute()
Voor elke vlag (vlag iteratie)
In sommige zeer specifieke scenario's zouden we de behoefte voelen om een specifieke actie uit te voeren voor elke vlag van de bronvermelding.
We kunnen een eenvoudige generieke uitbreidingsmethode schrijven om deze taak te realiseren.
<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
Gebruiksvoorbeeld:
Dim flags As FileAttributes = (FileAttributes.ReadOnly Or FileAttributes.Hidden)
flags.ForEachFlag(Of FileAttributes)(
Sub(ByVal x As FileAttributes)
Console.WriteLine(x.ToString())
End Sub)
Bepaal het aantal vlaggen in een vlagcombinatie
Het volgende voorbeeld is bedoeld om het aantal vlaggen in de opgegeven vlagcombinatie te tellen.
Het voorbeeld wordt verstrekt als een uitbreidingsmethode:
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Function CountFlags(ByVal sender As [Enum]) As Integer
Return sender.ToString().Split(","c).Count()
End Function
Gebruiksvoorbeeld:
Dim flags As FileAttributes = (FileAttributes.Archive Or FileAttributes.Compressed)
Dim count As Integer = flags.CountFlags()
Console.WriteLine(count)
Zoek de dichtstbijzijnde waarde in een Enum
De volgende code laat zien hoe u de dichtstbijzijnde waarde van een Enum kunt vinden .
Eerst definiëren we dit Enum dat dient om zoekcriteria op te geven (zoekrichting)
Public Enum EnumFindDirection As Integer
Nearest = 0
Less = 1
LessOrEqual = 2
Greater = 3
GreaterOrEqual = 4
End Enum
En nu implementeren we het zoekalgoritme:
<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
Gebruiksvoorbeeld:
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)