Enums e constantes. Qual usar quando?

94

Eu estava lendo algumas enums e as achei muito semelhantes a declarar constantes. Como saberia quando usar uma constante em vez de um enum ou vice-versa. Quais são algumas das vantagens de usar enums?

Draco
fonte
consulte também stackoverflow.com/questions/11575376/… para perguntas semelhantes sobre Java (as respostas também se aplicam principalmente a C #).
Alexei Levenkov

Respostas:

95

Use enums quando quiser definir um intervalo de valores que algo pode ser. A cor é um exemplo óbvio como:

public enum Colour
{
    White,
    Red,
    Blue
}

Ou talvez um conjunto de coisas possíveis como: (Exemplo, roubei daqui porque sou preguiçoso)

[FlagsAttribute]
enum DistributedChannel
{
  None = 0,
  Transacted = 1,
  Queued = 2,
  Encrypted = 4,
  Persisted = 16,
  FaultTolerant = Transacted | Queued | Persisted
}

As constantes devem ser para um único valor, como PI. Não há uma faixa de valores de PI, há apenas PI.

Outros pontos a considerar são:

  • a: Constantes não indicam necessariamente uma relação entre as constantes, enquanto uma enumeração indica que algo pode ser um do conjunto definido pelo enum.
  • b: Uma enumeração definida pode ajudá-lo com a verificação de tipo quando usada como um argumento. Constantes são apenas valores, portanto, não fornecem informações semânticas adicionais.
Andrew Barrett
fonte
1
E se você acabar usando muito .ToString()no enum, qualquer valor no uso de uma classe com strings const que se parece e age como um enum, mas evita uma chamada para ToString()? Exemplo
Sinjai
Espere, acho que respondi minha própria pergunta. O código naquele exemplo não funcionaria: você teria que interpretar a entrada como uma string, que não se comportaria realmente como um enum.
Sinjai
1
Por que você não poderia simplesmente ter uma classe estática Color com cores constantes em vez de enum? Qual é a diferença?
WDUK
em resumoType Safety"
ahmednabil88,
30

O que está faltando nas outras respostas é que enums têm um tipo de base inteira. Você pode alterar o padrão de int para qualquer outro tipo integral, exceto char como:

enum LongEnum : long {
    foo,
    bar,
}

Você pode converter explicitamente e implicitamente no tipo base, o que é útil em instruções switch. Esteja ciente de que é possível converter qualquer valor do tipo base em um enum, mesmo se o enum não tiver nenhum membro com o valor apropriado. Portanto, usar sempre a seção padrão em um switch é uma boa ideia. BTW, o próprio .NET permite enums com valor de ponto flutuante, mas você não pode defini-los em C #, embora eu ache que você ainda pode usá-los (exceto em switch).

Além disso, o uso de enums oferece mais segurança de digitação. Se você pretende usar, por exemplo, constantes int como parâmetros de método, eu poderia chamar o método com qualquer valor int. Concedido, por meio do casting isso pode acontecer com enums também, mas não acontecerá acidentalmente. Pior é a possibilidade de confundir a ordem dos parâmetros.

void method(int a, int b) {...}

Se apenas a constante A pode ir para a e a constante B apenas pode ir para b, o uso de dois tipos diferentes de enum revelará qualquer uso incorreto durante a compilação.

Johannes
fonte
20

Uma constante é um recurso de linguagem que diz que a variável não mudará de valor (então o compilador pode fazer otimizações em torno desse conhecimento) onde um enum é um tipo específico.

Constantes podem ser qualquer tipo de dados, mas enum é um enum.

Eu uso um enum em qualquer lugar onde você possa ter várias opções e quiser melhorar a legibilidade do código. ou seja, você pode ter níveis de rastreamento como um int com valores 0, 1, 2 ou como um enum como erro, aviso e informações.

Os Enum também podem ser usados ​​como operadores bit a bit, ou seja, FontStyle.Bold | FontStyle.Italic forneceria fontes em negrito e itálico.

Robert MacLean
fonte
8

Além da resposta de Robert:

  1. Use enum para um conjunto finito de valores nomeados. Você realmente não se importa com o valor numérico por trás de cada símbolo (mas ainda tem a capacidade de impô-los, por exemplo, para compatibilidade com um sistema legado).

  2. Robert: Sim, Enum's podem ser usados ​​como campos de bits. Use o atributo Flags (e certifique-se de que os membros da enum tenham valores numéricos adequados).

Serge Wautier
fonte
3

A constante AC # é semelhante a uma variável, pois dá um nome definido a um valor. No entanto, uma constante difere de uma variável padrão porque, uma vez definida, o valor atribuído à constante nunca pode ser alterado. O principal benefício das constantes é sua ajuda na criação de código autodocumentável, bem como permitir a declaração de valores-chave em um único lugar, o que permite fácil manutenção caso o valor precise ser atualizado e o software recompilado.

Enquanto as listas de Enumeradores são úteis para definir sequências e estados, particularmente quando há uma progressão natural através desses estados. Isso ocorre porque cada constante na lista pode ser formatada e comparada usando seu nome ou valor. Um enum também pode ser usado para definir um conjunto limitado de valores válidos.

simplesmente áspero
fonte
3

Uma coisa que acho útil quando uso em enumvez de consté que você pode iterar por meio dos valores em um enum, é muito mais difícil fazer isso com constvalores.

David Klempfner
fonte