Gli Enumerativi "Flag"

pubblicato il 08/02/2007

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 rezza 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: innanzitutto la definizione è preceduta dall'attributo Flags, e questo l'avevamo già detto; in secondo luogo ad ogni elemento viene associato un valore che deve obbligatoriamente essere una potenza di due (ricordo che 1 = 2 ^ 0); oppure, se preferite, il primo valore deve avere valore 1 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é?