Tipos de enumeración (Guía de programación de C#)

Actualización: Julio de 2008

Un tipo de enumeración (también denominado enumeración o enum) proporciona una manera eficaz de definir un conjunto de constantes integrales con nombre que pueden asignarse a una variable. Por ejemplo, suponga que tiene que definir una variable cuyo valor representará un día de la semana. Sólo hay siete valores significativos que almacenará dicha variable. Para definir esos valores, puede utilizar un tipo de enumeración, que se declara mediante la palabra clave enum.

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 

De forma predeterminada, el tipo subyacente de cada elemento de la enumeración es int. Puede especificar otro tipo numérico integral utilizando dos puntos, como se muestra en el ejemplo anterior. Para obtener una lista completa de los tipos posibles, vea enum (Referencia de C#).

A continuación se describen las ventajas de utilizar una enumeración en lugar de un tipo numérico:

  • Se especifica claramente para el código de cliente qué valores son válidos para la variable.

  • En Visual Studio, IntelliSense muestra los valores definidos.

Si no se especifican valores para los elementos en la lista de enumeradores, los valores se incrementan automáticamente en 1. En el ejemplo anterior, Days.Sunday tiene un valor de 0, Days.Monday tiene un valor de 1, y así sucesivamente. Al crear un nuevo objeto Days, éste tendrá un valor predeterminado de Days.Sunday (0) si no se le asigna un valor explícitamente. Al crear una enumeración, seleccione el valor predeterminado más lógico y asígnele el valor cero. De esta forma, todas las enumeraciones tendrán ese valor predeterminado si no se les asigna un valor explícitamente al crearlas.

Si la variable meetingDay es de tipo Days, (sin una conversión explícita) sólo puede asignarle uno de los valores definido por Days. Además, si cambia el día de la reunión, puede asignar un nuevo valor de Days a meetingDay:

Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;
Nota:

Es posible asignar un valor entero cualquiera a meetingDay. Por ejemplo, esta línea de código no genera un error: meetingDay = (Days) 42. Sin embargo, se recomienda no hacerlo, ya que la expectativa implícita es que una variable de enumeración contenga solamente uno de los valores definidos por la enumeración. La asignación de un valor arbitrario a una variable de un tipo de enumeración presenta un alto riesgo de errores.

Puede asignar cualquier valor a los elementos de la lista de enumeradores de un tipo de enumeración; además, también puede utilizar valores calculados:

enum MachineState
{
    PowerOff = 0,
    Running = 5,
    Sleeping = 10,
    Hibernating = Sleeping + 5
}

Tipos de enumeración como marcadores de bits

Puede utilizar un tipo de enumeración para definir marcadores de bits, lo que permite que una instancia del tipo de enumeración almacene cualquier combinación de los valores definidos en la lista de enumeradores. (Por supuesto, puede que algunas combinaciones no tengan sentido o no se permitan en el código del programa.)

Para crear una enumeración de marcadores de bits, aplique el atributo System.FlagsAttribute y defina los valores de forma adecuada de manera que se puedan realizar en ellos las operaciones bit a bit de tipo AND, OR, NOT y XOR. En una enumeración de marcadores de bits, incluya una constante con nombre de valor cero que signifique que "no se ha establecido ningún marcador". No asigne a un marcador el valor cero si éste no significa "no se ha establecido ningún marcador".

En el ejemplo siguiente, se define otra versión de la enumeración Days, que se denomina Days2. Days2 tiene el atributo Flags y a cada valor se le asigna la siguiente potencia mayor de 2. Esto le permite crear una variable Days2 cuyos valores son Days2.Tuesday y Days2.Thursday.

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}

Para establecer un marcador en una enumeración, utilice el operador lógico OR como se muestra en el ejemplo siguiente:

// Initialize with two flags using bitwise OR.
meetingDays = Days2.Tuesday | Days2.Thursday;

// Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days2.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday

// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday

Para determinar si se ha establecido un marcador específico, utilice una operación lógica AND, como se muestra en el ejemplo siguiente:

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.

Para obtener más información sobre los aspectos que debe tener en cuenta al definir tipos de enumeración con el atributo System.FlagsAttribute, vea System.Enum.

Utilizar métodos System.Enum para detectar y manipular valores de enumeración

Todas las enumeraciones son instancias del tipo System.Enum. No puede derivar clases nuevas de System.Enum, pero puede utilizar sus métodos para detectar información relacionada y manipular los valores de una instancia de enumeración.

string s = Enum.GetName(typeof(Days), 4);
Console.WriteLine(s);

Console.WriteLine("The values of the Days Enum are:");
foreach (int i in Enum.GetValues(typeof(Days)))
    Console.WriteLine(i);

Console.WriteLine("The names of the Days Enum are:");
foreach (string str in Enum.GetNames(typeof(Days)))
    Console.WriteLine(str);

Para obtener más información, vea System.Enum.

También puede crear un método nuevo para una enumeración a través de un método de extensión. Para obtener más información, vea Cómo: Crear un método nuevo para una enumeración (Guía de programación de C#).

Vea también

Conceptos

Guía de programación de C#

Referencia

enum (Referencia de C#)

System.Enum

Historial de cambios

Fecha

Historial

Motivo

Julio de 2008

Se ha agregado un tema.

Corrección de errores de contenido.