Imagine que eu defini o seguinte Enum:
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
Qual é a melhor prática para usar enum? Ele deve começar com 1
o exemplo acima ou com 0
(sem os valores explícitos) assim:
public enum Status : byte
{
Inactive,
Active
}
Respostas:
Diretrizes de projeto de estrutura :
Diretrizes de projeto de estrutura / Projeto de enums de bandeira :
fonte
switch
instruções, ele será direcionado para adefault
seção em que eu aInvalidEnumArgumentException
. Caso contrário, um programa pode inadvertidamente continuar executando com o valor zero de uma enumeração, que pode ser válido e passar despercebido.Bem, acho que discordo da maioria das respostas que dizem para não numerá-las explicitamente. Eu sempre os numero explicitamente, mas isso ocorre porque, na maioria dos casos, acabo persistindo em um fluxo de dados em que eles são armazenados como um valor inteiro. Se você não adicionar explicitamente os valores e, em seguida, adicionar um novo valor, poderá interromper a serialização e não conseguir carregar com precisão os objetos persistentes antigos. Se você deseja fazer algum tipo de armazenamento persistente desses valores, eu recomendo definir explicitamente os valores.
fonte
Um Enum é um tipo de valor e seu valor padrão (por exemplo, para um campo Enum em uma classe) será 0 se não for inicializado explicitamente.
Portanto, você geralmente deseja ter 0 como uma constante definida (por exemplo, Desconhecida).
No seu exemplo, se você quiser
Inactive
ser o padrão, ele deverá ter o valor zero. Caso contrário, você pode considerar adicionar uma constanteUnknown
.Algumas pessoas recomendaram que você não especifique explicitamente valores para suas constantes. Provavelmente é um bom conselho na maioria dos casos, mas há alguns casos em que você deseja fazer isso:
Enums de sinalizadores
Enums cujos valores são usados em interoperabilidade com sistemas externos (por exemplo, COM).
fonte
[Flags] enum MyFlags { None = 0, A, B, Both = A | B, /* etc. */ }
é muito mais legível, do que[Flags] enum MyFlags { None = 0, A = 1, B = 2, Both = 3, /* etc */ }
.)[Flags] enum MyFlags { None=0, A, B, C }
, resultaria[Flags] enum MyFlags { None=0, A=1, B=2, C=3 }
, enquanto que para um enum de Flags você normalmente desejaria C = 4.A menos que você tenha um motivo específico para alterá-lo, deixe enumerações com seus valores padrão, que começam em zero.
fonte
Eu diria que a melhor prática é não numerá-los e deixá-los implícitos - o que começaria a partir de 0. Como está implícito a preferência de idioma que é sempre bom seguir :)
fonte
Eu começaria um enum do tipo booleano com um 0.
A menos que "Inativo" signifique algo diferente de "Inativo" :)
Isso mantém o padrão para aqueles.
fonte
Eu diria que depende de como você os usa. Para sinalizar enum, é uma boa prática ter 0 como
None
valor, assim:Quando é provável que seu enum seja mapeado para uma tabela de pesquisa de banco de dados, eu o iniciaria com 1. Não deve importar muito para código escrito profissionalmente, mas isso melhora a legibilidade.
Em outros casos, eu deixaria como está, sem importar se eles começam com 0 ou 1.
fonte
A menos que você tenha um bom motivo para usar os valores brutos, só deve usar valores implícitos e referenciá-los com
Status.Active
eStatus.Inactive
.O problema é que você pode querer armazenar dados em um arquivo simples ou banco de dados, ou usar um arquivo simples ou banco de dados que outra pessoa criou. Se você estiver fazendo isso sozinho, faça com que a numeração se ajuste ao que o Enum é usado.
Se os dados não forem seus, é claro que você deseja usar o que o desenvolvedor original usou como esquema de numeração.
Se você planeja usar o Enum como um conjunto de sinalizadores, há uma convenção simples que vale a pena seguir:
Os valores devem ter potências de dois e podem ser expressos usando operações de deslocamento de bits.
None
, obviamente deveria ser0
, masAll
é menos obviamente-1
.~0
é a negação binária de0
e resulta em um número que tem todos os bits definidos como1
, o que representa um valor de-1
. Para sinalizadores compostos (frequentemente usados por conveniência), outros valores podem ser mesclados usando o bit a bit ou o operador|
.fonte
Não atribua nenhum número. Basta usá-lo como deveria ser usado.
fonte
Se não especificado, a numeração começa em 0.
É importante ser explícito, pois as enums geralmente são serializadas e armazenadas como int, não como uma string.
Para qualquer enumeração armazenada no banco de dados, sempre numeramos explicitamente as opções para evitar mudanças e reatribuição durante a manutenção.
De acordo com a Microsoft, a convenção recomendada é usar a primeira opção zero para representar um valor padrão não inicializado ou o mais comum.
Abaixo está um atalho para iniciar a numeração em 1 em vez de 0.
Se você deseja definir valores de sinalizador para usar operadores de bit em valores de enumeração, não comece a numerar com o valor zero.
fonte
Se você começar com 1, poderá facilmente contar suas coisas.
Se você começar com 0, use o primeiro como um valor para coisas não inicializadas.
fonte
Primeiro, a menos que você esteja especificando valores específicos por um motivo (o valor numérico tem significado em outro lugar, por exemplo, o banco de dados ou o serviço externo), não especifique valores numéricos e deixe que sejam explícitos.
Em segundo lugar, você deve sempre ter um item de valor zero (em enumerações sem sinalizadores). Esse elemento será usado como o valor padrão.
fonte
Não inicie-os em 0, a menos que haja um motivo, como usá-los como índices para uma matriz ou lista, ou se houver outro motivo prático (como usá-los em operações bit a bit).
Você
enum
deve começar exatamente onde precisa. Também não precisa ser seqüencial. Os valores, se explicitamente definidos, precisam refletir algum significado semântico ou consideração prática. Por exemplo, umenum
de "garrafas na parede" deve ser numerado de 1 a 99, enquanto umenum
para potências de 4 provavelmente deve começar em 4 e continuar com 16, 64, 256 etc.Além disso, a adição de um elemento com valor zero ao
enum
deve ser feito apenas se representar um estado válido. Às vezes "nenhum", "desconhecido", "ausente" etc. são valores válidos, mas muitas vezes não são.fonte
Eu gosto de iniciar minhas enumerações em 0, pois esse é o padrão, mas também gosto de incluir um valor desconhecido, com o valor -1. Isso se torna o padrão e às vezes pode ajudar na depuração.
fonte