Visual Basic .NET Language
Enumerar
Buscar..
Definición de enumeración
Una enumeración es un conjunto de constantes lógicamente relacionadas.
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
Inicialización de miembros
Cada uno de los miembros de la enumeración puede inicializarse con un valor. Si no se especifica un valor para un miembro, de manera predeterminada, se inicializa en 0 (si es el primer miembro de la lista de miembros) o en un valor mayor en 1 que el valor del miembro anterior.
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
El atributo Flags
Con el atributo <Flags>
, la enumeración se convierte en un conjunto de indicadores. Este atributo permite asignar múltiples valores a una variable de enumeración. Los miembros de una enumeración de banderas deben inicializarse con potencias de 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 ()
El método HasFlag()
se puede usar para verificar si un indicador está establecido.
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
Para obtener más información sobre el atributo Flags y cómo se debe usar, consulte la documentación oficial de Microsoft .
Análisis de cuerdas
Se puede crear una instancia de Enum analizando una representación de cadena del 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
Vea también: Analizar una cadena a un valor Enum en VB.NET
GetNames ()
Devuelve los nombres de constantes en el Enum especificado como una matriz de cadena:
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
Salida:
Pequeña
Medio
Grande
GetValues ()
'Este método es útil para iterar valores 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
Huellas dactilares:
1
2
4
Encadenar()
El método ToString
en una enumeración devuelve el nombre de cadena de la enumeración. Por ejemplo:
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
Sin embargo, si se desea la representación de cadena del valor entero real de la enumeración, puede convertir la enumeración a un Integer
y luego llamar a ToString
:
Dim shirtSize As Size = Size.Medium
Dim output As String = CInt(shirtSize).ToString()
Console.WriteLine(output) ' Writes "1"
Determine si un Enum tiene FlagsAttribute especificado o no
El siguiente ejemplo se puede usar para determinar si una enumeración tiene el atributo FlagsAttribute especificado. La metodología utilizada se basa en la reflexión .
Este ejemplo dará un resultado True
:
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)
Este ejemplo dará un resultado False
:
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)
Podemos diseñar un método de extensión de uso genérico como este:
<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
Ejemplo de uso:
Dim result As Boolean = (New FileAttributes).HasFlagsAttribute()
Para cada bandera (iteración de bandera)
En algunos escenarios muy específicos, sentiríamos la necesidad de realizar una acción específica para cada marca de la enumeración de origen.
Podemos escribir un método de extensión genérico simple para realizar esta tarea.
<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
Ejemplo de uso:
Dim flags As FileAttributes = (FileAttributes.ReadOnly Or FileAttributes.Hidden)
flags.ForEachFlag(Of FileAttributes)(
Sub(ByVal x As FileAttributes)
Console.WriteLine(x.ToString())
End Sub)
Determine la cantidad de banderas en una combinación de bandera
El siguiente ejemplo está destinado a contar la cantidad de banderas en la combinación de bandera especificada.
El ejemplo se proporciona como un método de extensión:
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Function CountFlags(ByVal sender As [Enum]) As Integer
Return sender.ToString().Split(","c).Count()
End Function
Ejemplo de uso:
Dim flags As FileAttributes = (FileAttributes.Archive Or FileAttributes.Compressed)
Dim count As Integer = flags.CountFlags()
Console.WriteLine(count)
Encuentra el valor más cercano en un Enum
El siguiente código ilustra cómo encontrar el valor más cercano de un Enum .
Primero definimos este Enum que servirá para especificar los criterios de búsqueda (dirección de búsqueda)
Public Enum EnumFindDirection As Integer
Nearest = 0
Less = 1
LessOrEqual = 2
Greater = 3
GreaterOrEqual = 4
End Enum
Y ahora implementamos el algoritmo de búsqueda:
<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
Ejemplo de uso:
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)