Tipos de enumeração (guia de programação translation from VPE for Csharp)

Um tipo de enumeração (também chamado de uma enumeração ou enum) fornece uma maneira eficiente para definir um conjunto de constantes nomeadas integrais que podem ser atribuídos 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 no enum é int.Você pode especificar outro tipo numérico integral por meio de dois-pontos, sistema autônomo mostrado no exemplo anterior.Para obter uma lista completa dos possíveis tipos, consulte Enum (translation from VPE for Csharp Reference).

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

  • Claramente você especificar para quais valores são válido para a variável de código do cliente.

  • In Visual StudioO IntelliSense lista os valores definidos.

Quando você não especificar valores para os elementos na lista de enumerador, os valores são incrementados automaticamente por 1.No exemplo anterior, Days.Sunday o valor 0, Days.Monday tem um valor de 1 e assim por diante. Quando você criar um novo Days o objeto, ele terá um valor padrão de Days.Sunday (0) se você não explicitamente atribua ele um valor. Quando você criar enum, selecionar o valor padrão mais lógico e atribua a ele um valor igual a 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, e, 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ção:

É possível atribuir qualquer valor arbitrário inteiro 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á conter apenas um dos valores definidos por 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 aos elementos na lista 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 sistema autônomo sinalizadores de bit

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

Você cria um pouco de sinalizadores de enum aplicando o System.FlagsAttribute atributo e definir os valores adequadamente, de modo que AND, OR, NOT e XOR operações bit a bit podem ser executadas sobre eles. Em um bit enum sinalizadores, incluir uma constante nomeada com um valor zero significa "sem sinalizadores são conjunto." Não fornecer um sinalizar de um valor de zero se isso não significa "sem os sinalizares são conjunto".

No exemplo a seguir, outra versão do Days Enum, que é nomeada Days2, é definido. Days2 possui o Flags atributo e cada valor é atribuído a próxima maior capacidade 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 conjunto um sinalizar em um enum, use o lógico 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 sinalizar específico é conjunto, use uma lógica AND operação, sistema autônomo 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ê definir tipos de enumeração com o System.FlagsAttribute o atributo, consulte System.Enum.

Usando os métodos de sistema.Enum para detectar e manipular valores de Enum

Todas as enumerações são instâncias do System.Enum Digite. Você não pode 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 um enum utilizando um método de extensão.Para obter mais informações, consulte Como: Criar um novo método para uma enumeração (guia de programação translation from VPE for Csharp).

Consulte também

Conceitos

Guia de Programação C#

Referência

Enum (translation from VPE for Csharp Reference)

System.Enum

Date

History

Motivo

Julho de 2008

Tópico adicional.

Correção de bug do conteúdo.