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é datatypeinitializer 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

Vedi anche