Non intendo in questo articolo descrivere gli enumerativi in Visual Basic, credo che siano un argomento sufficientemente semplice per darlo per scontato. Solo ricordo brevemente che dato un enumerativo del tipo:
Public Enum Animali Cane Gatto Canarino Criceto End Enum
possiamo definire una variabile di tipo Animali che contenga il valore corrispondente ad uno di questi animali:
Dim myPet as Animali = Animali.Cane
La cosa che interessa qui rimarcare è che la variabile myPet
consente di specificare un solo valore: con buona pace della Protezione Animali, la variabile può assumere solamente il valore Cane
oppure Gatto
oppure Canarino
oppure Criceto
. Un enumerativo sifatto sarebbe perfetto come proprietà di una classe AnimaleDomestico
(ad esempio) per indicare a quale razza appartiene un dato animale.
Ma se invece volessimo indicare di quali animali è proprietario un individuo? Potrebbe benissimo darsi che si possieda oltre ad un Cane
anche un Gatto
od un Criceto
: come possiamo esprimere ciò con un enumerativo? Dobbiamo cambiare la definizione dell’enumerativo, anteponendogli l’attributo Flags
:
<Flags()> Public Enum Animali Cane = 1 Gatto = 2 Canarino = 4 Criceto = 8 End Enum
Come si può notare, sono due le differenze rispetto all’esempio precedente:
- la definizione è preceduta dall’attributo
Flags
, e questo l’avevamo già detto - ad ogni elemento viene associato un valore che deve obbligatoriamente essere una potenza di
2
(ricordo che1 = 2 ^ 0
); oppure, se preferite, il primo valore deve avere valore1
e ogni elemento successivo deve raddoppiare il valore del precedente.
A questo punto non resta che utilizzare la variabile di cui sopra; per indicare che abbiano sia un cane, sia un canarino, si usa la parola chiave Or
(in gergo: per impostare a On
sia il cane sia il canarino):
myPet = Animali.Cane Or Animali.Canarino
Per rimuovere un elemento (o impostare a Off
un elemento) si usano le parole chiave And Not
:
myPet = myPet And Not Animali.Canarino
Infine per verificare se una variabile riporta un certo valore (se un determinato flag è On
):
If (myPet And Animali.Cane) = Animali.Cane ' True End If
Un ultima cosa occorre aggiungere: gli enumerativi Flag possono contenere un massimo di 32
elementi. Riuscite ad indovinare perché?