Tipos de enumeración (Guía de programación de C#)Enumeration types (C# Programming Guide)

Un tipo de enumeración (también denominado enumeración) proporciona una manera eficaz de definir un conjunto de constantes enteras con nombre que se pueden asignar a una variable.An enumeration type (also named an enumeration or an enum) provides an efficient way to define a set of named integral constants that may be assigned to a variable. Por ejemplo, suponga que tiene que definir una variable cuyo valor representará un día de la semana.For example, assume that you have to define a variable whose value will represent a day of the week. Dicha variable solo almacenará siete valores significativos.There are only seven meaningful values which that variable will ever store. Para definir esos valores, puede usar un tipo de enumeración, que se declara mediante la palabra clave enum.To define those values, you can use an enumeration type, which is declared by using the enum keyword.

enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Month : 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 entero mediante el uso del signo de dos puntos, como se muestra en el ejemplo anterior.By default the underlying type of each element in the enum is int. You can specify another integral numeric type by using a colon, as shown in the previous example. Para obtener una lista completa de los tipos posibles, vea enum (Referencia de C#).For a full list of possible types, see enum (C# Reference).

Puede comprobar los valores numéricos subyacentes mediante la conversión al tipo subyacente, como se muestra en el ejemplo siguiente.You can verify the underlying numeric values by casting to the underlying type, as the following example shows.

Day today = Day.Monday;
int dayNumber =(int)today;
Console.WriteLine("{0} is day number #{1}.", today, dayNumber);

Month thisMonth = Month.Dec;
byte monthNumber = (byte)thisMonth;
Console.WriteLine("{0} is month number #{1}.", thisMonth, monthNumber);

// Output:
// Monday is day number #1.
// Dec is month number #11.

Estas son las ventajas de usar una enumeración en lugar de un tipo numérico:The following are advantages of using an enum instead of a numeric type:

  • Se especifica claramente para el código de cliente qué valores son válidos para la variable.You clearly specify for client code which values are valid for the variable.

  • En Visual Studio, IntelliSense muestra los valores definidos.In Visual Studio, IntelliSense lists the defined values.

Cuando no se especifican valores para los elementos de la lista de enumeradores, los valores se incrementan automáticamente en 1.When you do not specify values for the elements in the enumerator list, the values are automatically incremented by 1. En el ejemplo anterior, Day.Sunday tiene un valor de 0, Day.Monday tiene un valor de 1, y así sucesivamente.In the previous example, Day.Sunday has a value of 0, Day.Monday has a value of 1, and so on. Cuando cree un nuevo objeto Day, tendrá un valor predeterminado de Day.Sunday (0) si no le asigna explícitamente un valor.When you create a new Day object, it will have a default value of Day.Sunday (0) if you do not explicitly assign it a value. Cuando cree una enumeración, seleccione el valor predeterminado más lógico y asígnele un valor de cero.When you create an enum, select the most logical default value and give it a value of zero. Esto hará que todas las enumeraciones tengan ese valor predeterminado si no se les asigna explícitamente un valor cuando se crean.That will cause all enums to have that default value if they are not explicitly assigned a value when they are created.

Si la variable meetingDay es de tipo Day, solo puede asignarle (sin una conversión explícita) uno de los valores definidos por Day.If the variable meetingDay is of type Day, then (without an explicit cast) you can only assign it one of the values defined by Day. Si el día de la reunión cambia, puede asignarle un nuevo valor de Day a meetingDay:And if the meeting day changes, you can assign a new value from Day to meetingDay:

Day meetingDay = Day.Monday;
//...
meetingDay = Day.Friday;

Nota

Es posible asignar un valor entero cualquiera a meetingDay.It's possible to assign any arbitrary integer value to meetingDay. Por ejemplo, esta línea de código no genera un error: meetingDay = (Day) 42.For example, this line of code does not produce an error: meetingDay = (Day) 42. Pero no debe 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.However, you should not do this because the implicit expectation is that an enum variable will only hold one of the values defined by the enum. La acción de asignar un valor arbitrario a una variable de un tipo de enumeración aumenta el riesgo de errores.To assign an arbitrary value to a variable of an enumeration type is to introduce a high risk for errors.

Puede asignar cualquier valor a los elementos de la lista de enumeradores de un tipo de enumeración, y también puede usar valores calculados:You can assign any values to the elements in the enumerator list of an enumeration type, and you can also use computed values:

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

Tipos de enumeración como marcas de bitsEnumeration types as bit flags

Puede usar un tipo de enumeración para definir marcas de bits, lo que permite que una instancia del tipo de enumeración almacene cualquier combinación de los valores que se definen en la lista de enumeradores.You can use an enumeration type to define bit flags, which enables an instance of the enumeration type to store any combination of the values that are defined in the enumerator list. (Obviamente, es posible que algunas combinaciones no sean significativas o no se permitan en el código del programa).(Of course, some combinations may not be meaningful or allowed in your program code.)

Para crear una enumeración de marcas de bits, aplique el atributo System.FlagsAttribute y defina los valores de forma adecuada para que se puedan realizar en ellos operaciones bit a bit AND, OR, NOT y XOR.You create a bit flags enum by applying the System.FlagsAttribute attribute and defining the values appropriately so that AND, OR, NOT and XOR bitwise operations can be performed on them. En una enumeración de marcas de bits, incluya una constante con nombre con un valor de cero que signifique "no se establecen marcas".In a bit flags enum, include a named constant with a value of zero that means "no flags are set." No le asigne a una marca un valor de cero si no significa "no se establecen marcas".Do not give a flag a value of zero if it does not mean "no flags are set".

En el ejemplo siguiente, se define otra versión de la enumeración Day, denominada Days.In the following example, another version of the Day enum, which is named Days, is defined. Days tiene el atributo Flags y a cada valor se le asigna la siguiente potencia de 2 superior.Days has the Flags attribute, and each value is assigned the next greater power of 2. Esto le permite crear una variable Days cuyo valor es Days.Tuesday | Days.Thursday.This enables you to create a Days variable whose value is Days.Tuesday | Days.Thursday.

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

Para establecer una marca en una enumeración, use el operador bit a bit OR tal como se muestra en el ejemplo siguiente:To set a flag on an enum, use the bitwise OR operator as shown in the following example:

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

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

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

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

Para determinar si se ha establecido una marca específica, use una operación bit a bit AND, tal como se muestra en el ejemplo siguiente:To determine whether a specific flag is set, use a bitwise AND operation, as shown in the following example:

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days.Thursday) == Days.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 lo que debe tener en cuenta para definir tipos de enumeraciones con el atributo System.FlagsAttribute, vea System.Enum.For more information about what to consider when you define enumeration types with the System.FlagsAttribute attribute, see System.Enum.

Usar los métodos System.Enum para detectar y manipular valores de enumeraciónUsing the System.Enum methods to discover and manipulate enum values

Todas las enumeraciones son instancias del tipo System.Enum.All enums are instances of the System.Enum type. No se pueden derivar clases nuevas de System.Enum, pero puede usar sus métodos para detectar información relacionada y manipular los valores de una instancia de enumeración.You cannot derive new classes from System.Enum, but you can use its methods to discover information about and manipulate values in an enum instance.

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

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

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

Para obtener más información, consulta System.Enum.For more information, see System.Enum.

También puede crear un método nuevo para una enumeración mediante un método de extensión.You can also create a new method for an enum by using an extension method. Para obtener más información, vea Cómo: Crear un método nuevo para una enumeración.For more information, see How to: Create a New Method for an Enumeration.

Vea tambiénSee also

System.Enum
Guía de programación de C#C# Programming Guide
enumenum