web-dev-qa-db-fra.com

Un Enum doit-il commencer par un 0 ou un 1?

Imaginons que j'ai défini l'énumération suivante:

public enum Status : byte
{
    Inactive = 1,
    Active = 2,
}

Quelle est la meilleure pratique pour utiliser enum? Devrait-il commencer par 1 comme dans l'exemple ci-dessus ou commencez par 0 (sans les valeurs explicites) comme ceci:

public enum Status : byte
{
    Inactive,
    Active
}
129
Acaz Souza

Directives de conception du cadre:

  • Ne fournissez une valeur nulle à votre enum non-flags Si None n'est pas approprié pour l'énum, ​​alors affectez la valeur zéro à l'élément qui devrait être utilisé comme valeur par défaut pour l'énum.

  • Évitez d’utiliser flag enum les valeurs des membres normaux qui sont négatifs ou nuls. .. Une valeur enum de zéro crée des problèmes avec et opérations, etc.

154
Andrey Taptunov

Bien, je suppose que je suis en désaccord avec la plupart des réponses qui disent de ne pas les numéroter explicitement. Je les numérote toujours explicitement, mais c'est parce que dans la plupart des cas, je finis par les conserver dans un flux de données où elles sont stockées sous forme de valeur entière. Si vous n'ajoutez pas explicitement les valeurs, puis une nouvelle valeur, vous pouvez interrompre la sérialisation et ne pas être en mesure de charger avec précision les anciens objets persistants. Si vous envisagez de stocker n'importe quel type de stockage persistant de ces valeurs, je vous recommande fortement de définir explicitement ces valeurs.

62
pstrjds

À moins que vous n'ayez une raison particulière de le modifier, laissez les énumérations avec leurs valeurs par défaut, qui commencent à zéro.

public enum Status : byte
{
    Inactive,
    Active
}
14
FishBasketGordo

Un Enum est un type de valeur et sa valeur par défaut (par exemple pour un champ Enum dans une classe) sera 0 si elle n'est pas initialisée explicitement.

Par conséquent, vous voulez généralement que 0 soit une constante définie (par exemple, Inconnu).

Dans votre exemple, si vous voulez que Inactive soit la valeur par défaut, la valeur zéro doit alors être définie. Sinon, vous pourriez envisager d’ajouter une constante Unknown.

Certaines personnes ont recommandé de ne pas spécifier explicitement les valeurs de vos constantes. Probablement un bon conseil dans la plupart des cas, mais il y a des cas où vous voudrez le faire:

  • Enums drapeaux

  • Enums dont les valeurs sont utilisées en interop avec des systèmes externes (par exemple, COM).

14
Joe

Je dirais que la meilleure pratique consiste à ne pas les numéroter et à les laisser être implicites - ce qui commencerait à 0. Puisque c'est implicite, c'est la préférence linguistique qui est toujours bonne à suivre :)

5

Je voudrais commencer un type booléen enum avec un 0.

Sauf si "Inatif" signifie autre chose que "Inactif" :)

Cela conserve la norme pour ceux-ci.

5
Mark Schultheiss

Je dirais que cela dépend de la façon dont vous les utilisez. Pour signaler une énumération, c'est une bonne pratique d'avoir 0 pour None valeur, comme ceci:

[Flags]
enum MyEnum
{
    None = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    All = Option1 | Option2 | Option3,
}

Lorsque votre énumération est susceptible d'être mappée à une table de recherche de base de données, je la commencerais par 1. Le code rédigé par un professionnel ne devrait pas avoir beaucoup d'importance, mais cela améliore la lisibilité.

Dans d’autres cas, je laisserais les choses telles qu’elles sont, ne me souciant pas de savoir si elles commencent par 0 ou 1.

5
Michael Sagalovich

Sauf si vous avez une bonne raison d'utiliser les valeurs brutes, vous ne devez jamais utiliser que des valeurs implicites et les référencer avec Status.Active et Status.Inactive.

Le problème est que vous souhaiterez peut-être stocker des données dans un fichier plat ou une base de données, ou utiliser un fichier plat ou une base de données créé par une autre personne. Si vous le créez vous-même, assurez-vous que la numérotation correspond à l'utilisation de Enum.

Si les données ne vous appartiennent pas, vous voudrez bien sûr utiliser ce que le développeur original avait utilisé comme schéma de numérotation.

Si vous envisagez d'utiliser Enum comme un ensemble d'indicateurs, il existe une convention simple qui mérite d'être suivie:

enum Example
{
  None      = 0,            //  0
  Alpha     = 1 << 0,       //  1
  Beta      = 1 << 1,       //  2
  Gamma     = 1 << 2,       //  4
  Delta     = 1 << 3,       //  8
  Epsilon   = 1 << 4,       // 16
  All       = ~0,           // -1
  AlphaBeta = Alpha | Beta, //  3
}

Les valeurs doivent être des puissances de deux et peuvent être exprimées à l'aide d'opérations de transfert de bits. None, devrait évidemment être 0, mais All est moins évident -1. ~0 est la négation binaire de 0 et donne un nombre dont chaque bit est réglé sur 1, qui représente une valeur de -1 . Pour les indicateurs composés (souvent utilisés pour des raisons de commodité), d'autres valeurs peuvent être fusionnées à l'aide de l'option bitwise ou de l'opérateur |.

4
zzzzBov

Si vous commencez à 1, alors vous pouvez facilement obtenir un compte de vos choses.

{
    BOX_THING1     = 1,
    BOX_THING2     = 2,
    BOX_NUM_THING  = BOX_THING2
};

Si vous commencez à 0, utilisez le premier comme valeur pour les choses non initialisées.

{
    BOX_NO_THING   = 0,
    BOX_THING1     = 1,
    BOX_THING2     = 2,
    BOX_NUM_THING  = BOX_THING2
};
2
Jonathan Cline IEEE

N'attribuez aucun numéro. Il suffit de l'utiliser comme il est supposé être utilisé.

2
Hooch

Si non spécifié, la numérotation commence à 0.

Il est important d'être explicite, car les énumérations sont souvent sérialisées et stockées sous la forme d'un entier, pas d'une chaîne.

Pour toute énumération stockée dans la base de données, nous numérotons toujours explicitement les options afin d’empêcher le décalage et la réaffectation pendant la maintenance.

Selon Microsoft, la convention recommandée consiste à utiliser la première option zéro pour représenter une valeur par défaut non initialisée ou la plus courante.

Vous trouverez ci-dessous un raccourci pour commencer à numéroter à 1 au lieu de 0.

public enum Status : byte
{
    Inactive = 1,
    Active
}

Si vous souhaitez définir des valeurs d'indicateur afin d'utiliser des opérateurs de bits sur des valeurs enum, ne commencez pas à numéroter à la valeur zéro.

2
dru

Tout d'abord, à moins que vous ne spécifiiez des valeurs spécifiques pour une raison (la valeur numérique a une signification ailleurs, c'est-à-dire la base de données ou le service externe), ne spécifiez aucune valeur numérique et laissez-les être explicites.

Deuxièmement, vous devriez toujours avoir un élément de valeur zéro (dans les énumérations non-flags). Cet élément sera utilisé comme valeur par défaut.

0
Justin Niessner

Ne les démarrez pas à 0 sauf indication contraire, par exemple en les utilisant comme indices dans un tableau ou une liste, ou s'il existe une autre raison pratique (par exemple, leur utilisation dans des opérations au niveau du bit).

Votre enum devrait commencer exactement là où il le faut. Cela n'a pas besoin d'être séquentiel non plus. Les valeurs, si elles sont explicitement définies, doivent refléter une signification sémantique ou une considération pratique. Par exemple, un enum de "bouteilles sur le mur" devrait être numéroté de 1 à 99, tandis qu'un enum pour des puissances de 4 devrait probablement commencer à 4 et se poursuivre avec 16, 64, 256. , etc.

De plus, l'ajout d'un élément de valeur zéro à la enum ne devrait être fait que s'il représente un état valide. Parfois, "none", "unknown", "missing", etc. sont des valeurs valides, mais plusieurs fois ne le sont pas.

0
wprl