.NET Framework Definizione Enum

Esempio

Un enum è un tipo speciale di classe. La parola chiave enum dice al compilatore che questa classe eredita dalla classe System.Enum astratta. Le enumerazioni vengono utilizzate per elenchi distinti di elementi.

public enum MyEnum
{
    Monday = 1,
    Tuesday,
    Wednesday,
    //...
}

Puoi pensare a un enum come un modo conveniente di mappare le costanti ad un valore sottostante. L'enum definito sopra dichiara i valori per ogni giorno della settimana e inizia con 1 . Tuesday verrà automaticamente mappato a 2 , Wednesday 3 , ecc.

Per impostazione predefinita, enum usa int come tipo sottostante e inizia da 0, ma puoi usare uno qualsiasi dei seguenti tipi interi : byte, sbyte, short, ushort, int, uint, long, or ulong e puoi specificare valori espliciti per qualsiasi articolo. Se alcuni elementi sono specificati in modo esplicito, ma alcuni non lo sono, ogni elemento dopo l'ultimo definito verrà incrementato di 1.

Vorremmo utilizzare questo esempio lanciando qualche altro valore a un MyEnum in questo modo:

MyEnum instance = (MyEnum)3; // the variable named 'instance' gets a 
                             //value of MyEnum.Wednesday, which maps to 3.

int x = 2;
instance = (MyEnum)x; // now 'instance' has a value of MyEnum.Tuesday

Un altro utile, anche se più complesso, tipo di enum è chiamato Flags . Decorando un enum con le Flags di attributo, è possibile assegnare un più di un valore variabile alla volta. Si noti che quando si esegue questa operazione è necessario definire esplicitamente i valori nella rappresentazione di base 2.

[Flags]
public enum MyEnum
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32, 
    Sunday = 64
}

Ora è possibile confrontare più di un valore alla volta, utilizzando confronti bit a bit o, se si utilizza .NET 4.0 o Enum.HasFlag successive, il metodo Enum.HasFlag .

MyEnum instance = MyEnum.Monday | MyEnum.Thursday; // instance now has a value of
                                                   // *both* Monday and Thursday,
                                                   // represented by (in binary) 0100. 

if (instance.HasFlag(MyEnum.Wednesday))
{
    // it doesn't, so this block is skipped
}
else if (instance.HasFlag(MyEnum.Thursday))
{
    // it does, so this block is executed
}

Poiché la classe Enum è sottoclasa da System.ValueType , viene trattata come un tipo di valore e passata per valore, non per riferimento. L'oggetto base viene creato sull'heap, ma quando si passa un valore enum in una chiamata di funzione, una copia del valore utilizzando il tipo di valore sottostante dell'Enum (in genere System.Int32) viene inserita nello stack. Il compilatore tiene traccia dell'associazione tra questo valore e l'oggetto di base creato nello stack. Vedi ValueType Class (System) (MSDN) per ulteriori informazioni.