Pagina personale di:
Carlo Vecchio
appunti di C#, R, SQL Server, ASP.NET, algoritmi, numeri
Vai ai contenuti

C# - Enumerazioni e strutture

C#

Enumerazioni (Enum)

  • Le Enumerazioni permettono di creare variabili che contengono un numero limitato di valori.
  • Per esempio si può creare la variabile 'orientamento' che può assumere i valori 'nord', 'sud', 'ovest' e 'est'.
  • Ogni elemento memorizzato è rappresentato da un numero (di tipo 'int'); il primo elemento è 0, il secondo è 1, eccetera.
  • Sintassi di una enumerazione:


   enum NomeEnum
   {
       membro1,
       membro2,
       membroN
   }


  • Esempio:


   public enum Interruttore
   {
       On,
       Off
   }


  • Utilizzo:

   Interruttore myInt;
   myInt = Interruttore.On;

  • Si può forzare un tipo diverso per memorizzare gli elementi così:

   public enum Interruttore : short
   {
       On,
       Off
   }


  • Si può anche forzare una corrispondenza numerica diversa da quella di default (che parte da 0). Agli elementi successivi vengono associati i numeri successivi.
  • Nell'esempio seguente viene anche mostrato come recuperare il valore intero associato ad un elemento.

   public enum Interruttore
   {
       On = 1,
       Off
   }
   Interruttore i = Interruttore.Off;
   Console.WriteLine(i);      // scrive 'Off'
   Console.WriteLine((int)i); // scrive 2


Conversioni

  • Data la seguente enumerazione, vediamo come leggere i nomi e i valori e come convertire nomi e valori e viceversa.

   public enum Direction
   {
       Nord,
       Sud,
       Ovest,
       Est
   }


   // Leggere i valori dell'enum.
   int[] values = (int[])Enum.GetValues(typeof(Direction));
   for (int i = 0; i < values.Length; i++)
   {
       Console.WriteLine(values[i]);
   }

   // Leggere i nomi dell'enum.
   string[] names = Enum.GetNames(typeof(Direction));
   for (int i = 0; i < values.Length; i++)
   {
       Console.WriteLine(names[i]);
   }
 
   // Converte da int a enum, occorre un cast.
   Direction d = (Direction)2;
 
   // Converte da enum a int, occorre un cast.
   int dir = (int)d;


Enumerazioni con Flags
  • Le Enumerazioni viste sopra, permettono l'assegnazione di un solo valore a una variabile.
  • È però possibile definire delle Enumerazioni dove a una variabile possono essere assegnati più valori contemporaneamente.
  • Per fare questo, basta assegnare i diversi valori dell'Enumerazione alle potenze di 2, come mostrato nell'esempio seguente.

   [Flags]
   enum GiorniSettimana
   {
       Lunedì = 1,
       Martedì = 2,
       Mercoledì = 4,
       Giovedì = 8,
       Venerdì = 16,
       Sabato = 32,
       Domenica = 64
   }

  • Si noti anche l'attributo '[Flags]', non obbligatorio ma utile nel caso si debba stampare il valore della variabile. Con l'attributo la variabile sarà stampata con il proprio nome, senza attributo la variabile sarà stampata con il valore.
  • Esempio di assegnazione multipla:

   GiorniSettimana giorniRiposo = GiorniSettimana.Sabato | GiorniSettimana.Domenica;
   Console.WriteLine(giorniRiposo);   // Scrive: Sabato, Domenica

  • Se non si fosse utilizzato l'attributo '[Flags]', il metodo 'WriteLine' avrebbe scritto '96'.
  • Per verificare il valore di una variabile, si utilizzi il codice seguente. I primi due esempi sono con una tecnica di verifica bit per bit. Gli altri due esempi sono con il metodo 'HasFlag()', presente dal .NET 4.0.

   // Verifica se in 'giorniRiposo' c'è 'Lunedì'.
   if ((giorniRiposo & GiorniSettimana.Lunedì) == GiorniSettimana.Lunedì)
       Console.WriteLine("Lunedì è giorno di riposo");
   else
       Console.WriteLine("Lunedì non è giorno di riposo");

   // Verifica se in 'giorniRiposo' c'è 'Sabato'.
   if ((giorniRiposo & GiorniSettimana.Sabato) == GiorniSettimana.Sabato)
       Console.WriteLine("Sabato è giorno di riposo");
   else
       Console.WriteLine("Sabato non è giorno di riposo");

   // Verifica se in 'giorniRiposo' c'è 'Lunedì'.
   if (giorniRiposo.HasFlag(GiorniSettimana.Lunedì))
       Console.WriteLine("Lunedì è giorno di riposo");
   else
       Console.WriteLine("Lunedì non è giorno di riposo");

   // Verifica se in 'giorniRiposo' c'è 'Sabato'.
   if (giorniRiposo.HasFlag(GiorniSettimana.Sabato))
       Console.WriteLine("Sabato è giorno di riposo");
   else
       Console.WriteLine("Sabato non è giorno di riposo");

Strutture (Struct)
  • Le strutture permettono di memorizzare gruppi di variabili, anche di tipi diversi.
  • Una struct è simile ad una classe, però la struct è un tipo valore, mentre una classe è un tipo riferimento. Ovviamente la struct non permette l'ereditarietà. L'occupazione di memoria è inferiore a quello di una classe con le stesse caratteristiche.
  • Definizione della struttura ‘Point’:

  struct Point
   {
       public int x;
       public int y;
   }

  • Utilizzo della struttura ‘Point’:

   Point inizio = new Point();

  • Utilizzo alternativo:

   Point inizio;
   inizio.x = 1;
   inizio.y = 2;

  • Definizione di un metodo dentro una struttura:

   struct Point
   {
       public int x;
       public int y;
       public int media()
       {
           return (x + y) / 2;
       }
   }

  • Costruttore dentro la struttura: attenzione, se viene scritto il costruttore occorre inizializzare tutti i membri.

   public Point(int x, int y)
   {
       this.x = x;
       this.y = y;
   }


© 2022 Carlo Vecchio
Torna ai contenuti