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:
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:
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:
Un esempio:Enum [Nome dell'Enumeratore] [nome valore1] [nome valore2] [nome valore3]'... End Enum
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.Module Module1Enum Operazione Acceso Spento StandBy Lavoro Calcolo NavigazioneEnd Enum Sub Main()Dim CPUAs 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.CalcoloEnd Sub End Module
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 State Acceso = 12 Spento'se il precedente uguale a 12, questo uguale a 13 StandBy'14 Lavoro = 20 Calcolo'21 Navigazione'22 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.Enum ProvaAs Int64 Valore1 = 8000000000 Valore2 = 8000000100 'eccetera End Enum
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 DivisioneEnd Enum '... Dim OpAs Operazione = Addizione'Sbagliato! Dim OpAs 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:
00001101Rappresenta 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:
Ora sappiamo come immagazzinare i campi, ma come si fa a leggerli? Nel procedimento inverso si una invece un And:Module Module1 'È convenzione che gli enumeratori che codificano a bit 'abbiano un nome al plurale 'Questo enumeratore definisce alcuni tipi di file Public Enum FileAttributesAs 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 = 8End Enum Sub Main()Dim FAs FileAttributes 'F all'inizio è 0, non contiene niente: '00000000 F = FileAttributes.Normal 'Ora F è 1, ossia Normal '00000001 F = FileAttributes.HiddenOr 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.ArchiveOr FileAttributes.SystemOr _ FileAttributes.Hidden 'La stessa cosa: '00001000 Or '00000100 Or '00000010 = '00001110 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.Module Module1Sub Main()Dim FAs FileAttributes F = FileAttributes.ArchiveOr FileAttributes.SystemOr _ 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 FAnd FileAttributes.Archive = FileAttributes.ArchiveThen Console.WriteLine("Il file è marcato come 'Archive'")End If Console.ReadKey()End Sub End Module
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



