En Visual Basic, las enumeraciones (Enum) se utilizan para declarar constantes enteras nombradas, lo que mejora la legibilidad y el mantenimiento del código. Las enumeraciones se declaran de la siguiente manera:
Public Enum StatusCode Success = 0 Warning = 1 Error = 2 End Enum
Aspectos importantes:
Ejemplo de uso:
Dim code As StatusCode = StatusCode.Success If code = StatusCode.Error Then Console.WriteLine("¡Error!") End If ' Asignación de un valor inexistente code = CType(5, StatusCode) ' Esto se compilará, pero el valor no está definido en Enum
¿Se puede asignar a una variable de tipo Enum un valor que no se encuentra entre los enumerados en Enum? ¿Qué consecuencias puede tener esto?
Sí, en Visual Basic (y .NET en general) se le puede asignar a la variable Enum cualquier valor numérico adecuado (según el tipo base) mediante una conversión explícita (
CType,DirectCast). Esto no provocará un error de compilación, pero puede dar lugar a problemas potenciales en el uso posterior, ya que tales valores no se representan en los nombres de los elementos Enum y no podrán ser interpretados correctamente mediante métodos como ToString. Por ejemplo:
Dim code As StatusCode = CType(42, StatusCode) Console.WriteLine(code) ' mostrará '42', no el nombre del elemento Enum
Historia
En un gran proyecto, los desarrolladores enviaban estados a través de WebAPI como int, y en el lado del cliente los convertían a Enum. Al aparecer nuevos valores no añadidos en Enum, la aplicación no mostraba información correcta, ya que faltaban las verificaciones de "validez" del valor Enum.
Historia
El uso de Enum sin Option Strict hacía que valores numéricos aleatorios obtenidos de fuentes externas se convirtieran implícitamente a Enum, provocando errores en la lógica de negocio que eran difíciles de rastrear en tiempo de ejecución.
Historia
La falta de especificación explícita del tipo base de Enum (por ejemplo, Byte para ahorrar memoria) llevó a un desbordamiento inesperado del tipo entero en una solución estrecha de microcontrolador en Compact Framework.