Instrucción Enum (Visual Basic)
Declara una enumeración y define los valores de sus miembros.
Sintaxis
[ <attributelist> ] [ accessmodifier ] [ Shadows ]
Enum enumerationname [ As datatype ]
memberlist
End Enum
Partes
attributelist
Opcional. Lista de atributos que se aplican a esta enumeración. La lista de atributos debe escribirse entre corchetes angulares ("
<
" y ">
").El atributo FlagsAttribute indica que el valor de una instancia de la enumeración puede incluir varios miembros de la enumeración y que cada uno de ellos representa un campo de bits en el valor de enumeración.
accessmodifier
Opcional. Especifica qué código puede acceder a esta enumeración. Puede ser uno de los siguientes:
Shadows
Opcional. Especifica que esta enumeración vuelve a declarar y oculta un elemento de programación con el mismo nombre, o un conjunto de elementos sobrecargados, en una clase base. Shadows solo se puede especificar en la propia enumeración, no en ninguno de sus miembros.
enumerationname
Necesario. Nombre de la enumeración. Para obtener información sobre los nombres válidos, consulte Nombres de elementos declarados.
datatype
Opcional. Tipo de datos de la enumeración y todos sus miembros.
memberlist
Necesario. Lista de constantes de miembro que se declaran en esta instrucción. Aparecen varios miembros en líneas de código fuente individuales.
Cada
member
tiene la sintaxis y las partes siguientes:[<attribute list>] member name [ = initializer ]
Parte Descripción membername
Necesario. Nombre de este miembro. initializer
Opcional. Expresión que se evalúa en el momento de la compilación y se asigna a este miembro. End
Enum
Finaliza el bloque
Enum
.
Comentarios
Si tiene un conjunto de valores que no cambian y que están relacionados lógicamente entre sí, puede definirlos juntos en una enumeración. Así consigue nombres significativos para la enumeración y sus miembros, que son más fáciles de recordar que sus valores. Después, puede usar los miembros de la enumeración en muchos lugares del código.
Entre las ventajas del uso de enumeraciones se incluyen:
Reduce los errores que provoca la transposición o la escritura incorrecta de números.
Facilita el cambio de valores en el futuro.
Facilita la lectura del código, lo que significa que es menos probable que se introduzcan errores.
Garantiza la compatibilidad con versiones posteriores. Si se usan enumeraciones, es menos probable que se produzca un error en el código si en el futuro alguien cambia los valores correspondientes a los nombres de miembro.
Una enumeración tiene un nombre, un tipo de datos subyacente y un conjunto de miembros. Cada miembro representa una constante.
Una enumeración declarada en el nivel de clase, estructura, módulo o interfaz, fuera de cualquier procedimiento, es una enumeración de miembros. Es un miembro de la clase, estructura, módulo o interfaz que la declara.
A las enumeraciones de miembros se puede acceder desde cualquier lugar dentro de su clase, estructura, módulo o interfaz. El código fuera de una clase, una estructura o un módulo debe calificar el nombre de una enumeración de miembros con el nombre de esa clase, estructura o módulo. Para evitar la necesidad de tener que usar nombres completos, agregue una instrucción Imports al archivo de origen.
Una enumeración declarada en el nivel de espacio de nombres, fuera de cualquier clase, estructura, módulo o interfaz, es un miembro del espacio de nombres en que aparece.
El contexto de la declaración de una enumeración debe ser un archivo de código fuente, un espacio de nombres, una clase, una estructura, un módulo o una interfaz y no puede ser un procedimiento. Para más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de acceso predeterminados).
Puede aplicar atributos a una enumeración en conjunto, pero no a sus miembros individualmente. Un atributo aporta información a los metadatos del ensamblado.
Tipo de datos
La instrucción Enum
puede declarar el tipo de datos de una enumeración. Cada miembro toma el tipo de datos de la enumeración. Puede especificar Byte
, Integer
, Long
, SByte
, Short
, UInteger
, ULong
o UShort
.
Si no se especifica datatype
para la enumeración, cada miembro toma el tipo de datos de su initializer
. Si especifica datatype
y initializer
, el tipo de datos de initializer
debe poder convertirse en datatype
. Si no están datatype
ni initializer
, el valor predeterminado del tipo de datos es Integer
.
Inicialización de miembros
La instrucción Enum
puede inicializar el contenido de los miembros seleccionados en memberlist
. Utilice initializer
para proporcionar una expresión que se va a asignar al miembro.
Si no se especifica initializer
para algún miembro, Visual Basic lo inicializa a cero (si es el primer member
de memberlist
) o a un valor mayor por uno de los inmediatamente anteriores member
.
La expresión que se especifica en cada initializer
puede ser cualquier combinación de literales, otras constantes que ya están definidas y miembros de enumeración que ya están definidos, incluido un miembro anterior de esta enumeración. Se pueden usar operadores aritméticos y lógicos para combinar estos elementos.
En initializer
no se pueden usar variables ni funciones. Sin embargo, se pueden usar palabras clave de conversión como CByte
y CShort
. También se puede usar AscW
si lo llama con una constante String
o un argumento Char
, ya que se puede evaluar en tiempo de compilación.
Las enumeraciones no pueden tener valores de punto flotante. Si a algún miembro se le asigna un valor de punto flotante y Option Strict
está establecido en activado, se produce un error del compilador. Si Option Strict
está desactivado, el valor se convierte automáticamente al tipo Enum
.
Si el valor de algún miembro supera el intervalo permisible para el tipo de datos subyacente, o si inicializa cualquier miembro al valor máximo permitido por el tipo de datos subyacente, el compilador notifica un error.
Modificadores
El valor predeterminado de las enumeraciones de miembros de clase, estructura, módulo e interfaz es el acceso público. Los niveles de acceso se pueden ajustar con los modificadores de acceso. Las enumeraciones de miembros de espacio de nombres tienen como valor predeterminado el acceso de confianza. Puede ajustar sus niveles de acceso a público, pero no a privado o protegido. Para obtener más información, consulte Niveles de acceso en Visual Basic.
Todos los miembros de enumeración tienen acceso público y no se pueden usar modificadores de acceso en ellos. Sin embargo, si la propia enumeración tiene un nivel de acceso más restringido, el nivel de acceso de enumeración especificado tiene prioridad.
De forma predeterminada, todas las enumeraciones son tipos y sus campos son constantes. Por consiguiente, las palabras clave Shared
, Static
y ReadOnly
no se pueden usar al declarar una enumeración o sus miembros.
Asignación de varios valores
Las enumeraciones suelen representar valores mutuamente excluyentes. Al incluir el atributo FlagsAttribute en la declaración Enum
, puede asignar varios valores a una instancia de la enumeración. El atributo FlagsAttribute especifica que la enumeración se debe tratar como un campo de bits, es decir, un conjunto de marcas, que se denominan enumeraciones bit a bit.
Si se declara una enumeración mediante el atributo FlagsAttribute, es aconsejable usar potencias de 2, es decir, 1, 2, 4, 8, 16, etc., para los valores. También se recomienda que "None" sea el nombre del miembro cuyo valor es 0. Para más instrucciones, consulte FlagsAttribute y Enum.
Ejemplo 1
En el ejemplo siguiente se muestra cómo usar la instrucción Enum
. Observe que el miembro se denomina EggSizeEnum.Medium
, no Medium
.
Public Class Egg
Enum EggSizeEnum
Jumbo
ExtraLarge
Large
Medium
Small
End Enum
Public Sub Poach()
Dim size As EggSizeEnum
size = EggSizeEnum.Medium
' Continue processing...
End Sub
End Class
Ejemplo 2
El método del ejemplo siguiente está fuera de la clase Egg
. Por lo tanto, EggSizeEnum
está completo como Egg.EggSizeEnum
.
Public Sub Scramble(ByVal size As Egg.EggSizeEnum)
' Process for the three largest sizes.
' Throw an exception for any other size.
Select Case size
Case Egg.EggSizeEnum.Jumbo
' Process.
Case Egg.EggSizeEnum.ExtraLarge
' Process.
Case Egg.EggSizeEnum.Large
' Process.
Case Else
Throw New ApplicationException("size is invalid: " & size.ToString)
End Select
End Sub
Ejemplo 3
En el ejemplo siguiente se usa la instrucción Enum
para definir un conjunto relacionado de valores constantes con nombre. En este caso, los valores son los colores que se pueden elegir para diseñar formularios de entrada de datos para una base de datos.
Public Enum InterfaceColors
MistyRose = &HE1E4FF&
SlateGray = &H908070&
DodgerBlue = &HFF901E&
DeepSkyBlue = &HFFBF00&
SpringGreen = &H7FFF00&
ForestGreen = &H228B22&
Goldenrod = &H20A5DA&
Firebrick = &H2222B2&
End Enum
Ejemplo 4
En el ejemplo siguiente se muestran valores, que incluyen números positivos y negativos.
Enum SecurityLevel
IllegalEntry = -1
MinimumSecurity = 0
MaximumSecurity = 1
End Enum
Ejemplo 5
En el ejemplo siguiente, se usa una cláusula As
para especificar el datatype
de una enumeración.
Public Enum MyEnum As Byte
Zero
One
Two
End Enum
Ejemplo 6
En el ejemplo siguientes se muestra cómo usar una enumeración bit a bit. Se pueden asignar varios valores a una instancia de una enumeración bit a bit. La declaración Enum
incluye el atributo FlagsAttribute, que indica que la enumeración se puede tratar como un conjunto de marcas.
' Apply the Flags attribute, which allows an instance
' of the enumeration to have multiple values.
<Flags()> Public Enum FilePermissions As Integer
None = 0
Create = 1
Read = 2
Update = 4
Delete = 8
End Enum
Public Sub ShowBitwiseEnum()
' Declare the non-exclusive enumeration object and
' set it to multiple values.
Dim perm As FilePermissions
perm = FilePermissions.Read Or FilePermissions.Update
' Show the values in the enumeration object.
Console.WriteLine(perm.ToString)
' Output: Read, Update
' Show the total integer value of all values
' in the enumeration object.
Console.WriteLine(CInt(perm))
' Output: 6
' Show whether the enumeration object contains
' the specified flag.
Console.WriteLine(perm.HasFlag(FilePermissions.Update))
' Output: True
End Sub
Ejemplo 7
En el siguiente ejemplo se itera una enumeración. Usa el método GetNames para recuperar una matriz de nombres de los miembros de la enumeración y GetValues para recuperar una matriz de valores de los miembros.
Enum EggSizeEnum
Jumbo
ExtraLarge
Large
Medium
Small
End Enum
Public Sub Iterate()
Dim names = [Enum].GetNames(GetType(EggSizeEnum))
For Each name In names
Console.Write(name & " ")
Next
Console.WriteLine()
' Output: Jumbo ExtraLarge Large Medium Small
Dim values = [Enum].GetValues(GetType(EggSizeEnum))
For Each value In values
Console.Write(value & " ")
Next
Console.WriteLine()
' Output: 0 1 2 3 4
End Sub