Dans Visual Basic, les énumérations (Enum) sont utilisées pour déclarer des constantes entières nommées, ce qui améliore la lisibilité et la maintenance du code. Les énumérations sont déclarées comme suit :
Public Enum StatusCode Success = 0 Warning = 1 Error = 2 End Enum
Aspects importants :
Exemple d'utilisation :
Dim code As StatusCode = StatusCode.Success If code = StatusCode.Error Then Console.WriteLine("Erreur !") End If ' Attribution d'une valeur inexistante code = CType(5, StatusCode) ' Cela se compilera, mais la valeur n'est pas définie dans l'Enum
Est-il possible d'attribuer à une variable de type Enum une valeur qui n'est pas parmi celles énumérées dans l'Enum ? Quelles en seront les conséquences ?
Oui, dans Visual Basic (et .NET en général), une variable Enum peut se voir attribuer n'importe quelle valeur numérique appropriée (selon le type de base) par conversion explicite (
CType,DirectCast). Cela ne déclenchera pas d'erreur de compilation, mais entraînera des problèmes potentiels lors de l'utilisation ultérieure, car ces valeurs ne se traduisent pas par les noms des éléments Enum et ne peuvent pas être correctement analysées via des méthodes comme ToString. Par exemple :
Dim code As StatusCode = CType(42, StatusCode) Console.WriteLine(code) ' affichera '42', et non le nom de l'élément Enum
Histoire
Dans un grand projet, les développeurs transmettaient des statuts via WebAPI en tant qu'int, et côté client, les convertissaient en Enum. Lors de l'apparition de nouvelles valeurs non ajoutées dans l'Enum, l'application ne montrait pas d'informations correctes car il n'y avait pas de vérifications sur la "validité" de la valeur Enum.
Histoire
L'utilisation de l'Enum sans Option Strict entraînait le fait que des valeurs numériques aléatoires, obtenues à partir de sources externes, étaient implicitement converties en Enum, provoquant des bogues dans la logique métier, difficiles à suivre en temps d'exécution.
Histoire
Le manque d'indication explicite du type de base de l'Enum (par exemple, Byte pour économiser de la mémoire) a conduit à un débordement inattendu du type entier dans une solution de microcontrôleur étroite sur le Compact Framework.