Casino online











Mercato forex






A9. Gli Enumeratori


L'Enumeratore è un tipo value che permette di definire insiemi di costanti raggruppate sotto un certo identificativo scelto arbitrariamente e viene dichiarato con la seguente sintassi:
Enum [Nome dell'Enumeratore]
  [nome valore1]
  [nome valore2]
  [nome valore3]
  '...
End Enum 
Un esempio:
Module Module1
  Enum Operazione
    Acceso
    Spento
    StandBy
    Lavoro
    Calcolo
    Navigazione
  End Enum
  
  Sub Main()
    Dim CPU As State

    Console.WriteLine("Il programma è aperto!")
    CPU = State.Acceso
    'operazioni
    Console.WriteLine("Il programma è in standby!")
    CPU = State.StandBy
    'operazioni
    Console.WriteLine("Il programma sta calcolando!")
    CPU = State.Calcolo
  End Sub
End Module 
In questo caso, l'enumeratore serve a tenere traccia delle operazioni che il programma svolge. Di default, ogni valore dell'enumeratore è inizializzato ad un numero intero crescente, a partire da 0 in avanti. Così il primo valore avrà un valore di 0, il secondo di 1 e via dicendo. In questo modo si possono utilizzare gli enumeratori anche nelle operazioni aritmetiche. Tuttavia è possibile inzializzare uno o tutti i valori ad un valore numerico stabilito: le costanti successive acquisiranno un valore incremenetato di una unità rispetto al precedente.
Enum State
  Acceso = 12
  Spento 'se il precedente  uguale a 12, questo  uguale a 13
  StandBy '14
  Lavoro = 20
  Calcolo '21
  Navigazione '22
End Enum 
Bisogna ricordare che non si possono assegnare valori decimali a un campo di un enumeratore: se lo si fa, questi verranno automaticamente approssimati all'intero più vicino mentre il programma è in esecuzione. Nonostante ciò è possibile fare in modo che tutti i valori di un enumeratore siano di un certo tipo apponendo la clausola As dopo il nome dell'enumeratore:
Enum Prova As Int64
  Valore1 = 8000000000
  Valore2 = 8000000100
  'eccetera
End Enum 
Anche se questo è utile per grandi valori ci sono ancora due cose da considerare: gli unici tipi ammessi dopo la clausola As per un enumeratore sono Integer (o Int32), UInteger (o UInt32), Byte, SByte, Long (o Int64), ULong (o UInt64), Short (Int16), UShort (o UInt16), che sono comunque tutti numeri interi; dato che i registri del computer su processori Intel sono a 32bit è meglio limitarsi a lasciare l'impostazione predefinita degli interi a 32bit (Integer), poichè produce migliori prestazioni.
A differenza dei metodi, gli enumeratori possono essere definiti a livello di namespace e non essere contenuti n� da moduli n� da classi. Da notare è anche il fatto che non è possibile accedere a un valore di enumeratore senza prima specificare il nome dell'enumeratore stesso:
Enum Operazione
  Addizione
  Sottrazione
  Moltiplicazione
  Divisione
End Enum
'...
Dim Op As Operazione = Addizione  'Sbagliato!
Dim Op As Operazione = Operazione.Addizione  'Giusto
 


Campi codificati a bit
Chi non conosca il codice binario può leggere un articolo su di esso qui.
I campi codificati a bit sono enumeratori che permettono di immagazzinare numerose informazioni in pochissimo spazio, anche in un solo byte! Di solito, tuttavia, si utilizzano tipi Int32 perchè si ha bisogno di un numero maggiore di informazioni. Il meccanismo è molto semplice. Ogni opzione deve poter assumere due valori, Vero o Falso: questi vengono quindi codificati da un solo bit (0 o 1), ad esempio:
00001101 
Rappresenta un intero senza segno a un byte, ossia il tipo Byte: in esso si possono immagazzinare 8 campi (uno per ogni bit), ognuno dei quali può essere acceso o spento. In questo caso, sono attivi solo il primo, il terzo e il quarto valore. Per portare a termine con successo le operazioni con enumeratori progettati per codificare a bit, è necessario che ogni valore dell'enumeratore sia una potenza di 2, da 0 fino al numero che ci interessa. Il motivo è molto semplice: dato che ogni potenza di due occupa un singolo spazio nel byte, non c'è pericolo che alcuna opzione si sovrapponga. Per unire insieme più opzioni bisogna usare l'operatore logico Or. Un esempio:
Module Module1
    'È convenzione che gli enumeratori che codificano a bit
    'abbiano un nome al plurale
    'Questo enumeratore definisce alcuni tipi di file
    Public Enum FileAttributes As Byte
        '1 = 2 ^ 0
        'In binario:
        '00000001
        Normal = 1

        '2 = 2 ^ 1
        '00000010
        Hidden = 2

        '4 = 2 ^ 2
        '00000100
        System = 4

        '8 = 2 ^ 3
        '00001000
        Archive = 8
    End Enum

    Sub Main()
        Dim F As FileAttributes
        'F all'inizio è 0, non contiene niente:
        '00000000

        F = FileAttributes.Normal
        'Ora F è 1, ossia Normal
        '00000001

        F = FileAttributes.Hidden Or FileAttributes.System
        'La situazione diventa complessa:
        'Il primo valore è   2: 000000010
        'Il secondo valore è 4: 000000100
        'Abbiamo già visto l'operatore Or: restituisce True se 
        'almeno una delle condizioni è vera: qui True è 1 e False è 0:
        '000000010 Or
        '000000100 =
        '000000110
        'Come si vede, ora ci sono due campi attivi: 4 e 2, che 
        'corrispondono a Hidden e System. Abbiamo fuso insieme due 
        'attributi con Or

        F = FileAttributes.Archive Or FileAttributes.System Or _ 
            FileAttributes.Hidden
        'La stessa cosa:
        '00001000 Or
        '00000100 Or
        '00000010 =
        '00001110
    End Sub
End Module 
Ora sappiamo come immagazzinare i campi, ma come si fa a leggerli? Nel procedimento inverso si una invece un And:
Module Module1
    Sub Main()
        Dim F As FileAttributes

        F = FileAttributes.Archive Or FileAttributes.System Or _ 
            FileAttributes.Hidden

        'Ora F è 00001110 e bisogna eseguire un'operazione di And sui bit, 
        'confrontando questo valore con Archive, che è 8. And restituisce 
        'Vero solo quando entrambe le condizioni sono vere:
        '00001110 And
        '00001000 =
        '00001000, ossia Archive!
        If F And FileAttributes.Archive = FileAttributes.Archive Then
            Console.WriteLine("Il file è marcato come 'Archive'")
        End If
        Console.ReadKey()
    End Sub
End Module 
In definitiva, per immagazzinare più dati in poco spazio occorre un enumeratore contenente solo valori che sono potenze di due; con Or si uniscono più campi; con And si verifica che un campo sia attivo.






 

The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.