Tipos de enumeração (guia de programação de C#)

Um tipo de enumeração (também chamado de uma enumeração ou um enum) fornece uma maneira eficiente para definir um conjunto de constantes nomeadas de integrais que pode ser atribuído a uma variável. Por exemplo, suponha que você precisa definir uma variável cujo valor representará um dia da semana. Há apenas sete valores significativos que essa variável sempre armazenará. Para definir esses valores, você pode usar um tipo de enumeração é declarado usando o enum palavra-chave.

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

Por padrão o tipo subjacente de cada elemento de enum é int. Você pode especificar outro tipo numérico integral usando uma vírgula, como mostrado no exemplo anterior Para obter uma lista completa de tipos possíveis, consulte enum (referência de C#).

Estas são as vantagens do uso de um enum em vez de um tipo numérico:

  • Você claramente pode especificar  o código do cliente onde os valores são válidos para a variável.

  • Em Visual Studio, IntelliSense listas de valores definidos.

Quando você não especificar valores para os elementos da lista de enumerador, os valores são automaticamente ser incrementados em 1. No exemplo anterior, Days.Sunday tem um valor de 0, Days.Monday tem um valor de 1 e assim por diante. Quando você cria um novo Days o objeto, ele terá um valor padrão de Days.Sunday (0) se você não explicitamente atribuir a ele um valor. Quando você cria um enum, selecione o valor padrão mais lógico e dê a ele um valor zero. Isso fará com que todos os enums ter esse valor padrão se eles não são atribuídos explicitamente um valor quando eles são criados.

Se a variável meetingDay é do tipo Days, em seguida, (sem uma conversão explícita) você só pode atribuir-um dos valores definidos pela Days. E se o dia de reunião for alterado, você pode atribuir um novo valor de Days para meetingDay:

Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;
ObservaçãoObservação

É possível atribuir qualquer valor de inteiro arbitrário para meetingDay. Por exemplo, esta linha de código não produz um erro: meetingDay = (Days) 42. No entanto, não faça isso porque a expectativa implícita é que uma variável de enum irá armazenar apenas um dos valores definidos pelo enum. Para atribuir um valor arbitrário a uma variável de um tipo de enumeração é apresentar um alto risco de erros.

Você pode atribuir quaisquer valores para os elementos da lista de enumerador de um tipo de enumeração e você também pode usar valores calculados:

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

Tipos de enumeração como sinalizadores de Bit

Você pode usar um tipo de enumeração para definir os sinalizadores de bit, que permite que uma instância do tipo de enumeração para armazenar qualquer combinação dos valores que são definidos na lista de enumerador. (É claro que, algumas combinações podem não estar significativo ou permitido em seu código de programa.)

Você cria um pouco de sinalizadores enum aplicando o System.FlagsAttribute de atributo e definir os valores adequadamente para que AND, OR, NOT e XOR operações bit a bit podem ser executadas neles. Em um pouco sinalizadores enum, incluem uma constante nomeada com um valor zero significa "nenhum sinalizador definido." Não forneça um sinalizador de um valor de zero se isso não significa "nenhum sinalizadores estão definidos".

No exemplo a seguir, a outra versão do Days enum, denominado Days2, é definido. Days2tem o Flags atributo e cada valor é atribuído a próxima maior potência de 2. Isso permite que você crie um Days2 variável cujo valor é Days2.Tuesday e 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 definir um sinalizador em um enum, use o operador bit a bit OR operador conforme mostrado no exemplo a seguir:

// 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 se um sinalizador específico está definido, use um bit a bit AND operação, conforme mostrado no exemplo a seguir:

// 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 obter mais informações sobre o que considerar quando você define os tipos de enumeração com o System.FlagsAttribute de atributo, consulte System.Enum.

Usando os métodos de System. Enum descobrir e manipular valores de Enum

Todos os enums são instâncias de System.Enum tipo. Não é possível derivar novas classes de System.Enum, mas você pode usar seus métodos para descobrir informações sobre e manipular valores em uma instância de enum.

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 obter mais informações, consulte System.Enum.

Você também pode criar um novo método para enum usando um método de extensão. Para obter mais informações, consulte How to: Criar um Novo método para uma enumeração (guia de programação de C#).

Consulte também

Referência

Enum (referência de C#)

System.Enum

Conceitos

C# Programming Guide