Istruzione Enum (Visual Basic)
Dichiara un'enumerazione e definisce i valori dei relativi membri.
Sintassi
[ <attributelist> ] [ accessmodifier ] [ Shadows ]
Enum enumerationname [ As datatype ]
memberlist
End Enum
Parti
attributelist
Facoltativo. Elenco degli attributi applicabili all'enumerazione. È necessario racchiudere l'elenco degli attributi tra parentesi angolari ("
<
" e ">
").L'attributo FlagsAttribute indica che il valore di un'istanza dell'enumerazione può includere più membri di enumerazione e che ogni membro rappresenta un campo di bit nel valore dell'enumerazione.
accessmodifier
Facoltativo. Specifica il tipo di codice che può accedere all'enumerazione. Può essere uno dei seguenti:
Shadows
Facoltativo. Specifica che l'enumerazione dichiara nuovamente e nasconde un elemento di programmazione omonimo o un set di elementi in overload in una classe di base. È possibile specificare Shadows solo sull'enumerazione stessa, non su nessuno dei relativi membri.
enumerationname
Obbligatorio. Nome dell'enumerazione. Per informazioni sui nomi validi, vedere Nomi di elementi dichiarati.
datatype
Facoltativo. Tipo di dati dell'enumerazione e di tutti i relativi membri.
memberlist
Obbligatorio. Elenco di costanti membro dichiarate in questa istruzione. Più membri vengono visualizzati su singole righe di codice sorgente.
Ogni
member
presenta la sintassi e le parti seguenti:[<attribute list>] member name [ = initializer ]
In parte Descrizione membername
Obbligatorio. Nome del membro. initializer
Facoltativo. Espressione valutata in fase di compilazione e assegnata al membro. End
Enum
Termina il blocco
Enum
.
Osservazioni:
Se si dispone di un set di valori non modificabili correlati logicamente tra loro, è possibile definirli insieme in un'enumerazione. In questo modo vengono specificati nomi significativi per l'enumerazione e i relativi membri, che sono più facili da ricordare rispetto ai relativi valori. È quindi possibile usare i membri dell'enumerazione in molte posizioni nel codice.
I vantaggi dell'uso delle enumerazioni includono quanto segue:
Riduce gli errori causati dalla trasposizione o dalla digitazione errata dei numeri.
Semplifica la modifica dei valori in futuro.
Semplifica la lettura del codice, il che significa che è meno probabile che vengano introdotti errori.
Assicura la compatibilità con le versioni successive. Se si usano le enumerazioni, è meno probabile che il codice abbia esito negativo se in futuro qualcuno modifica i valori corrispondenti ai nomi dei membri.
Un'enumerazione ha un nome, un tipo di dati sottostante e un set di membri. Ogni membro rappresenta una costante.
Un'enumerazione dichiarata a livello di classe, struttura, modulo o interfaccia, all'esterno di qualsiasi routine, è un'enumerazione dei membri. È un membro della classe, della struttura, del modulo o dell'interfaccia che la dichiara.
È possibile accedere alle enumerazioni dei membri da qualsiasi posizione all'interno della classe, della struttura, del modulo o dell'interfaccia. Il codice esterno a una classe, una struttura o un modulo deve qualificare il nome di un'enumerazione di membri con il nome di tale classe, struttura o modulo. È possibile evitare di usare obbligatoriamente nomi completi aggiungendo un'istruzione Imports al file di origine.
Un'enumerazione dichiarata a livello di spazio dei nomi, all'esterno di qualsiasi classe, struttura, modulo o interfaccia, è un membro dello spazio dei nomi in cui viene visualizzata.
Il contesto della dichiarazione per un'enumerazione deve essere un file di origine, uno spazio dei nomi, una classe, una struttura, un modulo o un'interfaccia e non può essere una routine. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.
È possibile applicare attributi a un'enumerazione nel suo complesso, ma non ai relativi membri singolarmente. Un attributo contribuisce a fornire informazioni ai metadati dell'assembly.
Tipo di dati
L'istruzione Enum
può dichiarare il tipo di dati di un'enumerazione. Ogni membro accetta il tipo di dati dell'enumerazione. È possibile specificare Byte
, Integer
, Long
, SByte
, Short
, UInteger
, ULong
o UShort
.
Se non si specifica datatype
per l'enumerazione, ogni membro accetta il tipo di dati del relativo initializer
. Se si specificano sia datatype
che initializer
, il tipo di dati di initializer
deve essere convertibile in datatype
. Se né datatype
né initializer
sono presenti, per impostazione predefinita il tipo di dati è Integer
.
Inizializzazione dei membri
L'istruzione Enum
può inizializzare il contenuto dei membri selezionati in memberlist
. Si usa initializer
per fornire un'espressione da assegnare al membro.
Se non si specifica initializer
per un membro, Visual Basic lo inizializza su zero (se è il primo member
in memberlist
) o su un valore maggiore di uno di quello del member
immediatamente precedente.
L'espressione fornita in ogni initializer
può essere una qualsiasi combinazione di valori letterali, altre costanti già definite e membri di enumerazione già definiti, incluso un membro precedente di questa enumerazione. È possibile usare operatori aritmetici e logici per combinare tali elementi.
Non è possibile usare variabili o funzioni in initializer
. Tuttavia, è possibile usare parole chiave di conversione come CByte
e CShort
. È anche possibile usare AscW
se si effettua la chiamata con un argomento String
o Char
della costante, perché può essere valutato in fase di compilazione.
Le enumerazioni non possono avere valori a virgola mobile. Se a un membro viene assegnato un valore a virgola mobile e Option Strict
viene attivato, si verifica un errore del compilatore. Se Option Strict
è disattivato, il valore viene convertito automaticamente nel tipo Enum
.
Se il valore di un membro supera l'intervallo consentito per il tipo di dati sottostante o se si inizializza un membro qualsiasi al valore massimo consentito dal tipo di dati sottostante, il compilatore segnala un errore.
Modificatori
Per impostazione predefinita, l'accesso alle enumerazioni del membro di classe, struttura, modulo e interfaccia sono pubbliche. È possibile regolare i livelli di accesso con i modificatori di accesso. Per impostazione predefinita, le enumerazioni del membro dello spazio dei nomi hanno accesso Friend. È possibile impostare i livelli di accesso su pubblico, ma non su privato o protetto. Per altre informazioni, vedere Livelli di accesso in Visual Basic.
Tutti i membri dell'enumerazione dispongono dell'accesso pubblico e non è possibile usare modificatori di accesso su di essi. Tuttavia, se l'enumerazione stessa ha un livello di accesso più limitato, il livello di accesso specificato dell'enumerazione ha la precedenza.
Per impostazione predefinita, tutte le enumerazioni sono tipi e i relativi campi sono costanti. Non è pertanto possibile utilizzare le parole chiave Shared
, Static
e ReadOnly
quando si dichiara un'enumerazione o i relativi membri.
Assegnazione di più valori
Le enumerazioni rappresentano in genere valori che si escludono a vicenda. Includendo l'attributo FlagsAttribute nella Enum
dichiarazione, è invece possibile assegnare più valori a un'istanza dell'enumerazione. L'attributo FlagsAttribute specifica che l'enumerazione deve essere considerata come un campo di bit, ovvero un set di flag. Queste sono denominate enumerazioni bit per bit.
Quando si dichiara un'enumerazione usando l'attributo FlagsAttribute, è consigliabile usare potenze di 2, ovvero 1, 2, 4, 8, 16 e così via, per i valori. È inoltre consigliabile che "Nessuno" sia il nome di un membro il cui valore è 0. Per altre linee guida, vedere FlagsAttribute e Enum.
Esempio 1
L'esempio seguente mostra come usare l'istruzione Enum
. Si noti che il membro viene definito EggSizeEnum.Medium
e non Medium
.
Public Class Egg
Enum EggSizeEnum
Jumbo
ExtraLarge
Large
Medium
Small
End Enum
Public Sub Poach()
Dim size As EggSizeEnum
size = EggSizeEnum.Medium
' Continue processing...
End Sub
End Class
Esempio 2
Il metodo nell'esempio seguente si trova all'esterno della classe Egg
. Pertanto, EggSizeEnum
è completo come Egg.EggSizeEnum
.
Public Sub Scramble(ByVal size As Egg.EggSizeEnum)
' Process for the three largest sizes.
' Throw an exception for any other size.
Select Case size
Case Egg.EggSizeEnum.Jumbo
' Process.
Case Egg.EggSizeEnum.ExtraLarge
' Process.
Case Egg.EggSizeEnum.Large
' Process.
Case Else
Throw New ApplicationException("size is invalid: " & size.ToString)
End Select
End Sub
Esempio 3
Nell'esempio seguente viene utilizzata l'istruzione Enum
per definire un set correlato di valori costanti denominati. In questo caso, i valori sono colori che è possibile scegliere per progettare moduli di immissione dati per un database.
Public Enum InterfaceColors
MistyRose = &HE1E4FF&
SlateGray = &H908070&
DodgerBlue = &HFF901E&
DeepSkyBlue = &HFFBF00&
SpringGreen = &H7FFF00&
ForestGreen = &H228B22&
Goldenrod = &H20A5DA&
Firebrick = &H2222B2&
End Enum
Esempio 4
L'esempio seguente mostra i valori che includono numeri positivi e negativi.
Enum SecurityLevel
IllegalEntry = -1
MinimumSecurity = 0
MaximumSecurity = 1
End Enum
Esempio 5
Nell'esempio seguente viene utilizzata una clausola As
per specificare il valore di datatype
di un'enumerazione.
Public Enum MyEnum As Byte
Zero
One
Two
End Enum
Esempio 6
Nell'esempio seguente viene illustrato come utilizzare l'enumerazione bit per bit. È possibile assegnare più valori a un'istanza di un'enumerazione bit per bit. La dichiarazione Enum
include l'attributo FlagsAttribute, che indica che l'enumerazione può essere considerata come un set di flag.
' Apply the Flags attribute, which allows an instance
' of the enumeration to have multiple values.
<Flags()> Public Enum FilePermissions As Integer
None = 0
Create = 1
Read = 2
Update = 4
Delete = 8
End Enum
Public Sub ShowBitwiseEnum()
' Declare the non-exclusive enumeration object and
' set it to multiple values.
Dim perm As FilePermissions
perm = FilePermissions.Read Or FilePermissions.Update
' Show the values in the enumeration object.
Console.WriteLine(perm.ToString)
' Output: Read, Update
' Show the total integer value of all values
' in the enumeration object.
Console.WriteLine(CInt(perm))
' Output: 6
' Show whether the enumeration object contains
' the specified flag.
Console.WriteLine(perm.HasFlag(FilePermissions.Update))
' Output: True
End Sub
Esempio 7
Nell'esempio seguente viene eseguita l'iterazione attraverso un'enumerazione. Usa il metodo GetNames per recuperare una matrice di nomi di membri dall'enumerazione e GetValues per recuperare una matrice di valori dei membri.
Enum EggSizeEnum
Jumbo
ExtraLarge
Large
Medium
Small
End Enum
Public Sub Iterate()
Dim names = [Enum].GetNames(GetType(EggSizeEnum))
For Each name In names
Console.Write(name & " ")
Next
Console.WriteLine()
' Output: Jumbo ExtraLarge Large Medium Small
Dim values = [Enum].GetValues(GetType(EggSizeEnum))
For Each value In values
Console.Write(value & " ")
Next
Console.WriteLine()
' Output: 0 1 2 3 4
End Sub