Historia de la pregunta
Las enumeraciones (Enum) en Visual Basic se utilizan para mejorar la legibilidad y la fiabilidad del código. Enum permite definir un conjunto de constantes nombradas, creando un conjunto estricto de valores permitidos para la lógica del programa.
Problema
Muchos creen que Enum restringe completamente los valores de una variable a uno de los miembros enumerados. Pero en realidad, una variable Enum almacena un valor de tipo entero, y se le puede asignar cualquier valor permitido para el tipo base, lo que puede llevar a errores y comportamientos inesperados.
Solución
En VB.NET no está prohibido asignar a una variable Enum un valor que no está definido en la lista. Para iterar de forma segura sobre los valores se utiliza la función System.Enum.GetValues. El control de la validez de los valores se asegura a través de verificaciones adicionales.
Ejemplo de código:
Enum Colors Red = 1 Green = 2 Blue = 3 End Enum Dim c As Colors = CType(4, Colors) ' ¡Esto no dará un error de compilación! For Each value As Colors In [Enum].GetValues(GetType(Colors)) Console.WriteLine(value) Next ' Verificación If [Enum].IsDefined(GetType(Colors), c) Then Console.WriteLine("OK") Else Console.WriteLine("¡Valor incorrecto!") End If
Características clave:
¿Se puede garantizar que una variable Enum siempre contenga solo valores declarados?
No. A nivel de lenguaje, Enum es una envoltura simplificada sobre el tipo numérico base. La verificación de la validez de valores específicos siempre debe hacerse explícitamente a través de IsDefined.
¿Es posible obtener la representación de cadena de Enum por su valor, incluso si no está declarado?
Sí. El método ToString para Enum asignado a un valor inexistente devolverá este equivalente numérico como cadena: por ejemplo, para Colors = 4, el resultado será "4".
¿Qué pasará si enumeramos todos los valores a través de Enum.GetValues y luego asignamos un número fuera de la enumeración a la variable Enum?
La iteración GetValues devolverá solo los miembros declarados, pero la variable Enum aún puede contener un número arbitrario fuera del rango; esto se convertirá en un error lógico y no en un error de sintaxis.
La entrada desde la pantalla se convierte directamente a Enum sin validación, lo que resulta en valores incorrectos y fallos de la aplicación en etapas posteriores.
Ventajas:
Desventajas:
El valor del usuario se valida primero a través de Enum.IsDefined, el procesamiento es correcto incluso para datos incorrectos.
Ventajas:
Desventajas: