Tipos de enumeração (Guia de Programação em C#)Enumeration types (C# Programming Guide)

Um tipo de enumeração (também chamado de uma enumeração ou enum) fornece uma maneira eficiente para definir um conjunto de constantes integrais nomeadas que podem ser atribuídas a um valor.An enumeration type (also named an enumeration or an enum) provides an efficient way to define a set of named integral constants that may be assigned to a variable. Por exemplo, suponha que você precisa definir uma variável cujo valor representará um dia da semana.For example, assume that you have to define a variable whose value will represent a day of the week. Há apenas sete valores significativos que essa variável armazenará.There are only seven meaningful values which that variable will ever store. Para definir esses valores, você pode usar um tipo de enumeração, que é declarado usando a palavra-chave enum.To define those values, you can use an enumeration type, which is declared by using the enum keyword.

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

Por padrão o tipo subjacente de cada elemento na enumeração é int. Você pode especificar outro tipo numérico integral usando dois-pontos, como mostrado no exemplo anterior.By default the underlying type of each element in the enum is int. You can specify another integral numeric type by using a colon, as shown in the previous example. Para obter uma lista completa dos tipos possíveis, consulte enum (Referência de C#).For a full list of possible types, see enum (C# Reference).

Você pode verificar os valores numéricos subjacentes com a conversão em tipo subjacente, como mostra o exemplo a seguir.You can verify the underlying numeric values by casting to the underlying type, as the following example shows.

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

Month thisMonth = Month.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 as vantagens de usar uma enumeração, em vez de um tipo numérico:The following are advantages of using an enum instead of a numeric type:

  • Você especifica claramente para o código do cliente quais valores são válidos para a variável.You clearly specify for client code which values are valid for the variable.

  • Em Visual StudioVisual Studio, o IntelliSense lista os valores definidos.In Visual StudioVisual Studio, IntelliSense lists the defined values.

Quando você não especifica valores para os elementos na lista de enumerador, os valores são automaticamente incrementados em 1.When you do not specify values for the elements in the enumerator list, the values are automatically incremented by 1. No exemplo anterior, Day.Sunday tem um valor de 0, Day.Monday tem um valor de 1 e assim por diante.In the previous example, Day.Sunday has a value of 0, Day.Monday has a value of 1, and so on. Ao criar um novo objeto Day, ele terá um valor padrão de Day.Sunday (0) se você não atribuir explicitamente um valor a ele.When you create a new Day object, it will have a default value of Day.Sunday (0) if you do not explicitly assign it a value. Quando você criar uma enumeração, selecione o valor padrão mais lógico e forneça a ele um valor igual a zero.When you create an enum, select the most logical default value and give it a value of zero. Isso fará com que todos os enumeradores tenham esse valor padrão se eles não tiverem um valor explicitamente atribuído quando forem criados.That will cause all enums to have that default value if they are not explicitly assigned a value when they are created.

Se a variável meetingDay for do tipo Day, (sem uma conversão explícita) você pode apenas atribuir a ele um dos valores definidos por Day.If the variable meetingDay is of type Day, then (without an explicit cast) you can only assign it one of the values defined by Day. E se o dia da reunião for alterado, você poderá atribuir um novo valor de Day para meetingDay:And if the meeting day changes, you can assign a new value from Day to meetingDay:

Day meetingDay = Day.Monday;
//...
meetingDay = Day.Friday;

Observação

É possível atribuir qualquer valor inteiro arbitrário a meetingDay.It's possible to assign any arbitrary integer value to meetingDay. Por exemplo, esta linha de código não produz um erro: meetingDay = (Day) 42.For example, this line of code does not produce an error: meetingDay = (Day) 42. No entanto, você não deve fazer isso porque a expectativa implícita é que uma variável enum conterá apenas um dos valores definidos pela enumeração.However, you should not do this because the implicit expectation is that an enum variable will only hold one of the values defined by the enum. Atribuir um valor arbitrário a uma variável de um tipo de enumeração é introduzir um alto risco de erros.To assign an arbitrary value to a variable of an enumeration type is to introduce a high risk for errors.

Você pode atribuir quaisquer valores aos elementos na lista de enumeradores de um tipo de enumeração e também pode usar valores computados:You can assign any values to the elements in the enumerator list of an enumeration type, and you can also use computed values:

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

Tipos de Enumeração como Sinalizadores de BitEnumeration types as bit flags

Você pode usar um tipo de enumeração para definir sinalizadores de bits, que permite que uma instância do tipo de enumeração armazenar qualquer combinação dos valores que são definidos na lista de enumeradores.You can use an enumeration type to define bit flags, which enables an instance of the enumeration type to store any combination of the values that are defined in the enumerator list. (Claro, algumas combinações podem não ser significativas ou permitidas em seu código de programa.)(Of course, some combinations may not be meaningful or allowed in your program code.)

Crie uma enumeração de sinalizadores de bits aplicando o atributo System.FlagsAttribute e definindo os valores apropriadamente para que operações bit a bit AND, OR, NOT e XOR possam ser executadas neles.You create a bit flags enum by applying the System.FlagsAttribute attribute and defining the values appropriately so that AND, OR, NOT and XOR bitwise operations can be performed on them. Em uma enumeração de sinalizadores de bits, inclua uma constante nomeada com um valor de zero que significa “nenhum sinalizador está definido”.In a bit flags enum, include a named constant with a value of zero that means "no flags are set." Não forneça um valor de zero a um sinalizador se isso não significar “nenhum sinalizador está definido”.Do not give a flag a value of zero if it does not mean "no flags are set".

No exemplo a seguir, outra versão da enumeração Day, que é chamada de Days, é definida.In the following example, another version of the Day enum, which is named Days, is defined. Days tem o atributo Flags e a cada valor é atribuída a próxima maior potência de 2.Days has the Flags attribute, and each value is assigned the next greater power of 2. Isso permite que você crie uma variável Days cujo valor é Days.Tuesday | Days.Thursday.This enables you to create a Days variable whose value is Days.Tuesday | Days.Thursday.

[Flags]
enum Days
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days meetingDays = Days.Tuesday | Days.Thursday;
}

Para definir um sinalizador em uma enumeração, use o operador OR de bit a bit mostrado no exemplo a seguir:To set a flag on an enum, use the bitwise OR operator as shown in the following example:

// Initialize with two flags using bitwise OR.
meetingDays = Days.Tuesday | Days.Thursday;

// Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday

// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday

Para determinar se um sinalizador específico é definido, use uma operação AND bit a bit, conforme mostrado no exemplo a seguir:To determine whether a specific flag is set, use a bitwise AND operation, as shown in the following example:

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days.Thursday) == Days.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.

Para saber mais sobre o que considerar ao definir tipos de enumeração com o atributo System.FlagsAttribute, veja System.Enum.For more information about what to consider when you define enumeration types with the System.FlagsAttribute attribute, see System.Enum.

Usando os Métodos System.Enum Methods para Descobrir e Manipular Valores EnumUsing the System.Enum methods to discover and manipulate enum values

Todas as enumerações são instâncias do tipo System.Enum.All enums are instances of the System.Enum type. 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 enumeração.You cannot derive new classes from System.Enum, but you can use its methods to discover information about and manipulate values in an enum instance.

string s = Enum.GetName(typeof(Day), 4);
Console.WriteLine(s);

Console.WriteLine("The values of the Day Enum are:");
foreach (int i in Enum.GetValues(typeof(Day)))
    Console.WriteLine(i);

Console.WriteLine("The names of the Day Enum are:");
foreach (string str in Enum.GetNames(typeof(Day)))
    Console.WriteLine(str);

Para obter mais informações, consulte System.Enum.For more information, see System.Enum.

Você também pode criar um novo método para uma enumeração usando um método de extensão.You can also create a new method for an enum by using an extension method. Para obter mais informações, consulte Como criar um novo método para uma enumeração.For more information, see How to: Create a New Method for an Enumeration.

Consulte tambémSee also

System.Enum
Guia de Programação em C#C# Programming Guide
enumenum