Enumeraciones del sistema de tipos común

Actualización: noviembre 2007

Una enumeración (enum) es una forma especial de un tipo de valor, que hereda de System.Enum y proporciona nombres alternativos para los valores de un tipo primitivo subyacente. Un tipo de enumeración tiene un nombre, un tipo subyacente y un conjunto de campos. El tipo subyacente debe ser uno de los tipos de entero con signo o sin signo integrados, por ejemplo, Byte, Int32 o UInt64. Los campos son campos literales estáticos, cada uno de los cuales representa una constante. El mismo valor se puede asignar a varios campos. Cuando es así, se debe marcar uno de los valores como valor de enumeración primario a los efectos de la reflexión y la conversión de cadenas.

Se puede asignar un valor del tipo subyacente a una enumeración y viceversa, y no es necesario que el motor en tiempo de ejecución realice una conversión. Se puede crear una instancia de una enumeración y llamar a los métodos de System.Enum, además de a cualquier método definido en el tipo subyacente de la enumeración. Sin embargo, ciertos lenguajes pueden no permitir que se pase una enumeración como parámetro cuando se requiere una instancia del tipo subyacente (o viceversa).

A las enumeraciones se les aplican las restricciones siguientes:

  • No pueden definir sus propios métodos.

  • No pueden implementar interfaces.

  • No pueden definir propiedades ni eventos.

  • Una enumeración no puede ser genérica, a menos que sea únicamente genérica porque está anidada dentro de un tipo genérico. Es decir, una enumeración no puede tener parámetros de tipo propios.

    Nota:

    Los tipos anidados (incluidas enumeraciones) creados con Visual Basic, C# y C++ incluyen los parámetros de tipo de todos los tipos genéricos envolventes, por lo que son genéricos incluso si no tienen parámetros de tipo propios. Para obtener más información, vea "Tipos anidados" en MakeGenericType.

    Es posible declarar una enumeración genérica en el lenguaje de ensamblado MSIL (Lenguaje intermedio de Microsoft), pero se genera una excepción TypeLoadException si se intenta utilizar la enumeración.

El atributo Flags indica una clase especial de enumeración, llamada campo de bits. El motor en tiempo de ejecución no distingue entre enumeraciones tradicionales y campos de bits, pero el lenguaje podría hacerlo. Cuando se hace esta distinción, se pueden utilizar operadores bit a bit en estos campos de bits, para generar valores sin nombre, pero no en las enumeraciones. Normalmente, las enumeraciones se utilizan para listas de elementos únicos, como los días de la semana, los nombres de países o regiones, etc. Los campos de bits se utilizan, en general, para listas de calidades o cantidades que pueden producirse en combinaciones, como Red And Big And Fast.

En el ejemplo siguiente se muestra cómo utilizar los campos de bits y las enumeraciones tradicionales.

using System;
using System.Collections;

// A traditional enumeration of some root vegetables.
public enum SomeRootVegetables
{
    HorseRadish,
    Radish,
    Turnip
}

// A bit field or flag enumeration of harvesting seasons.
[Flags]
public enum Seasons
{
    None = 0,
    Summer = 1,
    Autumn = 2,
    Winter = 4,
    Spring = 8,
    All = Summer | Autumn | Winter | Spring
}

// Entry point.
public class EnumerationSample
{
    public static void Main()
    {
        // Hash table of when vegetables are available.
        Hashtable AvailableIn = new Hashtable();

        AvailableIn[SomeRootVegetables.HorseRadish] = Seasons.All;
        AvailableIn[SomeRootVegetables.Radish] = Seasons.Spring;
        AvailableIn[SomeRootVegetables.Turnip] = Seasons.Spring | 
            Seasons.Autumn;

        // Array of the seasons, using the enumeration.
        Seasons[] seasons = new Seasons[] { Seasons.Winter, Seasons.Spring, 
            Seasons.Summer, Seasons.Autumn };

        // Print information of what vegetables are available each season.
        for (int i = 0; i < seasons.Length; i++)
        {
            Console.WriteLine(
                "The following root vegetables are harvested in "
                + seasons[i].ToString("G") + ":");
            foreach (DictionaryEntry e in AvailableIn)
            {
                // A bitwise comparison.
                if (((Seasons)e.Value & seasons[i]) > 0)
                    Console.WriteLine("  " +
                        ((SomeRootVegetables)e.Key).ToString("G"));
            }
        }
    }
}

Los resultados de este programa son los siguientes:

The following root vegetables are harvested in Summer:
  HorseRadish
The following root vegetables are harvested in Autumn:
  Turnip
  HorseRadish
The following root vegetables are harvested in Winter:
  HorseRadish
The following root vegetables are harvested in Spring:
  Turnip
  Radish
  HorseRadish

Adiciones de comunidad

Mostrar: