Share via


Tipos de enumeração (Guia de Programação em C#)

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

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 em enum é int. Você pode especificar um outro tipo numérico integral usando dois pontos, conforme mostrado no exemplo anterior. Para obter uma lista completa de tipos possíveis, consulte enum (referência do C#).

Você pode verificar os valores numéricos para o tipo subjacente converter subjacente, como mostra o exemplo a seguir.

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

Months thisMonth = Months.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.

A seguir estão vantagens de usar um enum em vez de um tipo numérico:

  • Você especifica claramente para o código do cliente que os valores são válidas para a variável.

  • Em Visual Studio, o IntelliSense lista os valores definidos.

Quando você não especificar os valores dos elementos no enumerador listas, os valores são incrementadas automaticamente por 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 objeto de Days , terá um valor padrão de Days.Sunday (0) se você não explicitamente atribui um valor. Quando você cria um enum, selecione o valor padrão mais lógico e dê-lhe um valor de zero. Isso fará com que todos os enum terem aquele valor padrão se não são atribuídos explicitamente um valor quando eles são criados.

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

Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;

Dica

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

Você pode atribuir valores para todos os elementos na 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 sinalizadores de bit, que permite uma instância do tipo de enumeração para armazenar qualquer combinação de valores que são definidos na lista de enumeração. (Naturalmente, algumas combinações não podem ser significativos ou permitidas em seu código de programa.)

Você cria um enum de sinalizadores de bit aplicando o atributo de FlagsAttribute e definindo os valores de forma apropriada para que AND, OR, NOT e as operações bit a bit de XOR podem ser executados neles. Em um bit sinaliza enum, incluem uma constante nomeada com um valor de zero que significa “nenhum parâmetro é definido.” Não de um sinalizador um valor de zero se não significa “nenhum parâmetro é definido”.

No exemplo, outra versão enum de Days , que é chamado Days2, é definida. Days2 tem o atributo de Flags e cada valor seja atribuído a potência próximo maior que 2. Isso permite que você crie uma variável de Days2 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 de OR conforme mostrado no exemplo o 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ífica está definido, use uma operação bit a bit de AND , conforme mostrado no exemplo o 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 tipos de enumeração com o atributo de FlagsAttribute , consulte Enum.

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

Todos os enum são instâncias do tipo de Enum . Você não pode derivar novas classes de Enum, mas você pode usar seus métodos para descobrir quais informações sobre e para manipular valores em um enum instância.

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 [AllMembers.T:System.Enum].

Você também pode criar um novo método para um enum usando 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 em C#).

Capítulo caracterizado book

Mais sobre variáveis em Início Visual C# 2010

Consulte também

Referência

enum (Referência de C#)

Enum

Conceitos

Guia de Programação em C#