Gli Enumerativi “Flag” di Visual Basic.NET 

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:

  1. la definizione è preceduta dall’attributo Flags, e questo l’avevamo già detto
  2. ad ogni elemento viene associato un valore che deve obbligatoriamente essere una potenza di 2 (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é?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*