Enum (referência de C#)

O enum palavra-chave é usada para declarar uma enumeração, um tipo distinto, que consiste em um conjunto de constantes nomeadas denominada lista de enumerador.

Geralmente é melhor definir um enum dentro de um namespace para que todas as classes no namespace possam acessá-lo com a conveniência de igual. No entanto, um enum também pode ser aninhado dentro de uma classe ou struct.

Por padrão, o primeiro enumerador tem o valor 0 e o valor de cada enumerador sucessiva aumenta em 1. Por exemplo, na enumeração seguinte, Sat é 0, Sun é 1, Mon é 2e assim por diante.

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

Enumeradores podem usar os inicializadores para substituir os valores padrão, conforme mostrado no exemplo a seguir.

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

Desta enumeração, a seqüência dos elementos é forçada para iniciar a partir de 1 em vez de 0. No entanto, incluindo uma constante que tem o valor 0 é recomendado. Para obter mais informações, consulte Tipos de enumeração (guia de programação de C#).

Cada tipo de enumeração tem um tipo subjacente, o que pode ser qualquer tipo integral exceto char. O tipo subjacente de elementos de enumeração de padrão é int. Para declarar um enum de outro tipo integral, como bytes, use uma vírgula após o identificador seguido do tipo, conforme mostrado no exemplo a seguir.

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong.

Uma variável do tipo Days pode ser atribuído qualquer valor no intervalo do tipo subjacente; os valores não são limitados para as constantes nomeadas.

O valor padrão de um enum E é o valor produzido pela expressão (E)0.

ObservaçãoObservação

Um enumerador não pode conter espaços em branco em seu nome.

O tipo subjacente Especifica a quantidade de armazenamento é alocado para cada enumerador. No entanto, uma conversão explícita é necessário para converter de enum tipo como tipo integral. Por exemplo, a instrução a seguir atribui o enumerador Sun a uma variável do tipo int usando uma conversão para converter de enum para int.

int x = (int)Days.Sun;

Quando você aplica System.FlagsAttribute em uma enumeração que contém elementos que podem ser combinados com um bit a bit OR operação, o atributo afeta o comportamento da enum quando ele é usado com algumas ferramentas. Você pode observar essas alterações quando você usa ferramentas como o Console métodos de classe e o avaliador de expressão. (Consulte o terceiro exemplo).

Programação robusta

Como ocorre com qualquer constante, todas as referências para os valores individuais de um enum são convertidas em literais numéricos em tempo de compilação. Isso pode criar problemas potenciais de versionamento, conforme descrito em Constantes (guia de programação de C#).

Atribuindo valores adicionais para novas versões de enums ou alterando os valores dos membros enum em uma nova versão, pode causar problemas para o código fonte dependentes. Os valores enum são freqüentemente usados em Alternar instruções. Se os elementos adicionais foram adicionados para o enum pode ser selecionado o tipo, a seção padrão da instrução switch inesperadamente.

Se outros desenvolvedores usam seu código, você deve fornecer diretrizes sobre como o seu código deve reagir se novos elementos são adicionados a qualquer enum tipos.

Exemplo

No exemplo a seguir, uma enumeração Days, é declarada. Dois enumeradores são explicitamente convertidos para inteiro e atribuídos a variáveis de inteiro.


public class EnumTest
{
    enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

    static void Main()
    {
        int x = (int)Days.Sun;
        int y = (int)Days.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}
/* Output:
   Sun = 0
   Fri = 5
*/

No exemplo a seguir, a opção tipo de base é usada para declarar um enum cujos membros são do tipo long. Observe que, embora o tipo subjacente da enumeração long, os membros de enumeração ainda devem ser explicitamente convertidos no tipo long usando um cast.

public class EnumTest2
{
    enum Range : long { Max = 2147483648L, Min = 255L };
    static void Main()
    {
        long x = (long)Range.Max;
        long y = (long)Range.Min;
        Console.WriteLine("Max = {0}", x);
        Console.WriteLine("Min = {0}", y);
    }
}
/* Output:
   Max = 2147483648
   Min = 255
*/

O exemplo de código a seguir ilustra o uso e o efeito do System.FlagsAttribute de atributo em um enum declaração.

// Add the attribute Flags or FlagsAttribute.
[Flags]
public enum CarOptions
{
    // The flag for SunRoof is 0001.
    SunRoof = 0x01,
    // The flag for Spoiler is 0010.
    Spoiler = 0x02,
    // The flag for FogLights is 0100.
    FogLights = 0x04,
    // The flag for TintedWindows is 1000.
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        // The bitwise OR of 0001 and 0100 is 0101.
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;

        // Because the Flags attribute is specified, Console.WriteLine displays
        // the name of each enum element that corresponds to a flag that has
        // the value 1 in variable options.
        Console.WriteLine(options);
        // The integer value of 0101 is 5.
        Console.WriteLine((int)options);
    }
}
/* Output:
   SunRoof, FogLights
   5
*/

Comentários

Se você remover Flags, o exemplo exibe os seguintes valores:

5

5

Especificação da linguagem C#

Para obter mais informações, consulte C# Language Specification A especificação de linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

C# Keywords

Integral Types Table (C# Reference)

Built-In Types Table (C# Reference)

Implicit Numeric Conversions Table (C# Reference)

Explicit Numeric Conversions Table (C# Reference)

Conceitos

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

Design de enumeração

Outros recursos

C# Reference

Histórico de alterações

Date

History

Motivo

Dezembro de 2010

Comentários adicionados ao último exemplo.

Comentários do cliente.