enum (Referencia de C#)
La palabra clave enum se utiliza para declarar una enumeración, un tipo distinto que consiste en un conjunto de constantes con nombre denominado lista de enumeradores.
Normalmente suele ser recomendable definir una enumeración directamente dentro de un espacio de nombres para que todas las clases de dicho espacio puedan tener acceso a ésta con la misma facilidad. Sin embargo, una enumeración también puede anidarse dentro de una clase o struct.
De forma predeterminada, el primer enumerador tiene el valor 0 y el valor de cada enumerador sucesivo se incrementa en 1. Por ejemplo, en la siguiente enumeración, Sat es 0, Sun es 1, Mon es 2, etc.
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
Los enumeradores pueden usar inicializadores para invalidar los valores predeterminados, como se muestra en el ejemplo siguiente.
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
En esta enumeración, se obliga a que la secuencia de elementos empiece en 1 en vez de en 0. Sin embargo, se recomienda incluir una constante con el valor 0. Para obtener más información, vea Tipos de enumeración (Guía de programación de C#).
Cada tipo de enumeración tiene un tipo subyacente, que puede ser cualquier tipo entero excepto char. El tipo predeterminado subyacente de los elementos de la enumeración es int. Para declarar una enumeración de otro tipo entero, como byte, use un carácter de dos puntos después del identificador y escriba a continuación el tipo, como se muestra en el ejemplo siguiente.
enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
Los tipos admitidos para una enumeración son byte, sbyte, short, ushort, int, uint, long o ulong.
A una variable de tipo Days se le puede asignar cualquier valor en el intervalo del tipo subyacente; los valores no se limitan a las constantes con nombre.
El valor predeterminado de un elemento enum E es el valor producido por la expresión (E)0.
Nota |
---|
Un enumerador no puede contener espacio en blanco en su nombre. |
El tipo subyacente especifica el almacenamiento asignado para cada enumerador. No obstante, se necesita una conversión explícita para convertir un tipo enum a un tipo entero. Por ejemplo, la siguiente instrucción asigna el enumerador Sun a una variable de tipo int utilizando una conversión de tipos para convertir de enum a int.
int x = (int)Days.Sun;
Cuando se aplica FlagsAttribute a una enumeración que contiene algunos elementos que se pueden combinar con una operación OR bit a bit, se observará que el atributo afecta al comportamiento de enum cuando se utiliza con algunas herramientas. Se pueden observar estos cambios al utilizar herramientas tales como los métodos de la clase Console y el Evaluador de expresiones. (Vea el tercer ejemplo).
Programación sólida
Como ocurre con cualquier constante, todas las referencias a los valores individuales de una enumeración se convierten en literales numéricos en tiempo de compilación. Esto puede crear posibles problemas de versiones como se describe en Constantes (Guía de programación de C#).
Asignar valores adicionales a nuevas versiones de enumeraciones o cambiar los valores de los miembros de enumeración en una nueva versión puede producir problemas para el código fuente dependiente. Los valores enum se utilizan a menudo en instrucciones switch. Si los elementos adicionales se han agregado al tipo enum, la sección predeterminada de la instrucción switch se puede seleccionar de forma inesperada.
Si otros desarrolladores utilizan su código, debería proporcionar instrucciones sobre cómo debería reaccionar el código de ellos al agregar nuevos elementos a cualquier tipo enum.
Ejemplo
En el ejemplo siguiente, se declara una enumeración, Days. Dos enumeradores se convierten explícitamente en un número entero y se asignan a variables de número entero.
public class EnumTest
{
enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
static void Main()
{
int x = (int)Days.Sun;
int y = (int)Days.Fri;
Console.WriteLine("Sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
}
}
/* Output:
Sun = 0
Fri = 5
*/
En el ejemplo siguiente, la opción de tipo base se utiliza para declarar un enum cuyos miembros son del tipo long. Observe que a pesar de que el tipo subyacente de la enumeración es long, los miembros de la enumeración todavía deben convertirse explícitamente al tipo long mediante una conversión de tipos.
public class EnumTest2
{
enum Range : long { Max = 2147483648L, Min = 255L };
static void Main()
{
long x = (long)Range.Max;
long y = (long)Range.Min;
Console.WriteLine("Max = {0}", x);
Console.WriteLine("Min = {0}", y);
}
}
/* Output:
Max = 2147483648
Min = 255
*/
El ejemplo de código siguiente ilustra el uso y efecto del atributo FlagsAttribute en una declaración enum.
// Add the attribute Flags or FlagsAttribute.
[Flags]
public enum CarOptions
{
// The flag for SunRoof is 0001.
SunRoof = 0x01,
// The flag for Spoiler is 0010.
Spoiler = 0x02,
// The flag for FogLights is 0100.
FogLights = 0x04,
// The flag for TintedWindows is 1000.
TintedWindows = 0x08,
}
class FlagTest
{
static void Main()
{
// The bitwise OR of 0001 and 0100 is 0101.
CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
// Because the Flags attribute is specified, Console.WriteLine displays
// the name of each enum element that corresponds to a flag that has
// the value 1 in variable options.
Console.WriteLine(options);
// The integer value of 0101 is 5.
Console.WriteLine((int)options);
}
}
/* Output:
SunRoof, FogLights
5
*/
Comentarios
Si quita Flags, el ejemplo muestra los siguientes valores:
5
5
Especificación del lenguaje C#
Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.
Vea también
Referencia
Tabla de tipos enteros (Referencia de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Conceptos
Tipos de enumeración (Guía de programación de C#)