.NET Framework Definición de enumeración


Ejemplo

Un enum es un tipo especial de clase. La palabra clave enum le dice al compilador que esta clase hereda de la clase abstracta System.Enum. Las enumeraciones se utilizan para distintas listas de elementos.

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

Puede pensar en una enumeración como una forma conveniente de asignar constantes a algún valor subyacente. La enumeración definida anteriormente declara valores para cada día de la semana y comienza con 1 . Tuesday se asignaría automáticamente a 2 , el Wednesday a 3 , etc.

Por defecto, las enumeraciones usan int como el tipo subyacente y comienzan en 0, pero puede usar cualquiera de los siguientes tipos integrales : byte, sbyte, short, ushort, int, uint, long, or ulong , y puede especificar valores explícitos para cualquier ít. Si algunos elementos se especifican explícitamente, pero otros no, cada elemento después del último definido se incrementará en 1.

Volveremos a utilizar este ejemplo echando algún otro valor a un MyEnum de este 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

Otro tipo de enumeración útil, aunque más complejo, se llama Flags . Al decorar una enumeración con el atributo Flags , puede asignar una variable más de un valor a la vez. Tenga en cuenta que al hacer esto debe definir los valores explícitamente en la representación de base 2.

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

Ahora puede comparar más de un valor a la vez, ya sea utilizando comparaciones a nivel de bits o, si está utilizando .NET 4.0 o posterior, el método 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
}

Como la clase Enum se subclasifica de System.ValueType , se trata como un tipo de valor y se pasa por valor, no por referencia. El objeto base se crea en el montón, pero cuando pasa un valor de enumeración a una llamada de función, una copia del valor que usa el tipo de valor subyacente de Enum (generalmente System.Int32) se inserta en la pila. El compilador rastrea la asociación entre este valor y el objeto base que se creó en la pila. Consulte ValueType Class (System) (MSDN) para obtener más información.