In Visual Basic, gli enumeratori (Enum) vengono utilizzati per dichiarare costanti intere nominate, il che migliora la leggibilità e la manutenibilità del codice. Gli enumeratori sono dichiarati nel seguente modo:
Public Enum StatusCode Success = 0 Warning = 1 Error = 2 End Enum
Sfumature importanti:
Esempio di utilizzo:
Dim code As StatusCode = StatusCode.Success If code = StatusCode.Error Then Console.WriteLine("Errore!") End If ' Assegnazione di un valore inesistente code = CType(5, StatusCode) ' Questo compila, ma il valore non è definito in Enum
È possibile assegnare a una variabile di tipo Enum un valore che non è presente tra quelli elencati in Enum? Quali possono essere le conseguenze?
Sì, in Visual Basic (e .NET in generale) è possibile assegnare a una variabile Enum qualsiasi valore numerico adatto (secondo il tipo sottostante) tramite conversione esplicita (
CType,DirectCast). Questo non genererà un errore di compilazione, ma porterà a potenziali problemi nel suo successivo utilizzo, poiché tali valori non vengono visualizzati come nomi degli elementi Enum e non possono essere correttamente analizzati tramite metodi come ToString. Ad esempio:
Dim code As StatusCode = CType(42, StatusCode) Console.WriteLine(code) ' stamperà '42', non il nome dell'elemento Enum
Storia
In un grande progetto, gli sviluppatori trasmettevano stati tramite WebAPI come int, e lato client li convertivano in Enum. All'emergere di nuovi valori, non aggiunti in Enum, l'applicazione non mostrava informazioni corrette, poiché mancavano controlli sulla "validità" dei valori Enum.
Storia
L'uso di Enum senza Option Strict portava a situazioni in cui valori numerici casuali provenienti da fonti esterne venivano implicitamente convertiti in Enum, causando bug nella logica aziendale, difficili da rintracciare durante il runtime.
Storia
La mancanza di specifica esplicita del tipo sottostante di Enum (ad esempio, Byte per risparmiare memoria) ha portato a un imprevisto overflow del tipo intero in una soluzione ristretta per microcontrollori su Compact Framework.