Historique de la question
Les énumérations (Enum) en Visual Basic sont utilisées pour améliorer la lisibilité et la fiabilité du code. Enum permet de définir un ensemble de constantes nommées, créant un ensemble strict de valeurs valables pour la logique du programme.
Problème
Beaucoup pensent que Enum limite complètement les valeurs d'une variable à l'un des membres énumérés. Mais en réalité, une variable Enum stocke une valeur entière et peut se voir attribuer n'importe quelle valeur valable pour le type de base, ce qui peut entraîner des erreurs et un comportement inattendu.
Solution
Dans VB.NET, il n'est pas interdit d'attribuer à une variable Enum une valeur non définie dans la liste. Pour itérer en toute sécurité sur les valeurs, on utilise la fonction System.Enum.GetValues. La validation des valeurs est assurée par des vérifications supplémentaires.
Exemple de code :
Enum Colors Red = 1 Green = 2 Blue = 3 End Enum Dim c As Colors = CType(4, Colors) ' Cela ne sera pas une erreur de compilation ! For Each value As Colors In [Enum].GetValues(GetType(Colors)) Console.WriteLine(value) Next ' Vérification If [Enum].IsDefined(GetType(Colors), c) Then Console.WriteLine("OK") Else Console.WriteLine("Valeur incorrecte !") End If
Caractéristiques clés :
Peut-on garantir qu'une variable Enum contient toujours uniquement des valeurs déclarées ?
Non. Au niveau du langage, Enum est un simple emballage autour d'un type numérique de base. La vérification de la validité des valeurs particulières doit toujours être effectuée explicitement via IsDefined.
Est-il possible d'obtenir une représentation sous forme de chaîne d'une Enum à partir de sa valeur, même si elle n'est pas déclarée ?
Oui. La méthode ToString pour une Enum attribuée à une valeur inexistante renverra cet équivalent numérique sous forme de chaîne : par exemple, pour Colors = 4, le résultat sera "4".
Que se passe-t-il si l'on énumère toutes les valeurs via Enum.GetValues, puis qu'on assigne à une variable Enum un nombre en dehors de l'énumération ?
L'itération GetValues ne renverra que les membres déclarés, mais la variable Enum peut tout de même contenir un nombre arbitraire en dehors de la plage — cela deviendra une erreur logique, pas une erreur de syntaxe.
L'entrée à partir de l'écran est directement convertie en Enum sans validation, produisant des valeurs incorrectes et un échec de l'application aux étapes ultérieures.
Avantages :
Inconvénients :
La valeur utilisateur est d'abord validée via Enum.IsDefined, le traitement est correct même pour des données incorrectes.
Avantages :
Inconvénients :