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

Imaginez que j’ai défini le Enum suivant:

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

Quelle est la meilleure pratique à utiliser enum? Doit-il commencer par 1 comme l’exemple ci-dessus ou commencer par 0 (sans les valeurs explicites) comme ceci:

 public enum Status : byte { Inactive, Active } 

Directives de conception du cadre:

  • Fournissez une valeur égale à zéro sur votre enum non-flags Si None n’est pas approprié pour l’énumération, atsortingbuez la valeur zéro à l’élément qui doit être utilisé comme valeur par défaut pour l’énumération.

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

Eh bien, je pense 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 de manière explicite, mais c’est parce que dans la plupart des cas, je finis par les persister dans un stream de données où ils sont stockés sous la forme d’un nombre entier. Si vous n’ajoutez pas explicitement les valeurs, puis ajoutez une nouvelle valeur, vous pouvez interrompre la sérialisation et ne plus pouvoir charger avec précision les anciens objects persistants. Si vous envisagez de stocker n’importe quel type de valeurs persistantes, il est fortement recommandé de définir explicitement les valeurs.

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

Par conséquent, vous souhaitez généralement avoir 0 comme constante définie (par exemple, Inconnu).

Dans votre exemple, si vous voulez que Inactive soit la valeur par défaut, alors elle devrait avoir la valeur zéro. Sinon, vous pouvez envisager d’append une constante Unknown .

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

  • Drapeaux enum

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

À moins que vous n’ayez une raison spécifique pour le changer, laissez les énumérations avec leurs valeurs par défaut, qui commencent à zéro.

 public enum Status : byte { Inactive, Active } 

Je dirais que la meilleure pratique est de ne pas les numéroter et de les laisser implicites – ce qui commencerait à partir de 0. Puisque c’est implicitement la préférence de langue qui est toujours bonne à suivre 🙂

Je commencerais un type booléen enum avec un 0.

Sauf si “Inatif” signifie autre chose que “Inactif” 🙂

Cela conserve la norme pour ceux-ci.

Je dirais que cela dépend de la façon dont vous les utilisez. Pour signaler un enum, il est conseillé d’avoir la valeur 0 pour None , 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 firebase database, je commencerais par 1. Cela ne devrait pas avoir beaucoup d’importance pour le code écrit par un professionnel, mais cela améliore la lisibilité.

Dans d’autres cas, je le laisserais tel quel, sans se soucier de savoir s’il commence par 0 ou 1.

Sauf si vous avez une bonne raison d’utiliser les valeurs brutes, vous ne devez 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 firebase database, ou utiliser un fichier plat ou une firebase database créée par quelqu’un d’autre. Si vous le faites vous-même, faites en sorte que la numérotation corresponde à l’utilisation de Enum.

Si les données ne sont pas les vôtres, 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 à suivre:

 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 décalage. None , évidemment, devrait être 0 , mais All est moins évident -1 . ~0 est la négation binary de 0 et donne un nombre dont chaque bit est défini sur 1 , ce 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 du bitwise ou de l'opérateur | .

N’atsortingbuez aucun chiffre. Il suffit de l’utiliser comme il est censé être utilisé.

Si vous commencez à 1, vous pouvez facilement compter vos affaires.

 { 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 }; 

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

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

Pour toute énumération stockée dans la firebase database, nous numérotons toujours de manière explicite les options afin d’éviter tout décalage et réassignation lors de la maintenance.

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

Voici 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 d’énumération, ne commencez pas à numéroter à la valeur zéro.

Tout d’abord, sauf si vous spécifiez des valeurs spécifiques pour une raison (la valeur numérique a un sens ailleurs, par exemple la firebase database ou un 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-drapeaux). Cet élément sera utilisé comme valeur par défaut.

Ne les lancez pas à 0 sauf s’il y a une raison, comme les utiliser comme index pour un tableau ou une liste, ou s’il existe une autre raison pratique (comme les utiliser dans des opérations au niveau du bit).

Votre enum devrait commencer exactement où il doit. Cela n’a pas besoin d’être séquentiel non plus. Les valeurs, si elles sont définies explicitement, 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 les puissances de 4 devrait probablement commencer à 4 et continuer avec 16, 64, 256, etc.

De plus, l’ajout d’un élément de valeur zéro à l’ enum ne devrait être effectué que s’il représente un état valide. Parfois, “none”, “unknown”, “missing”, etc. sont des valeurs valides, mais souvent non.

J’aime commencer mes énumérations à 0, puisque c’est la valeur par défaut, mais j’aime aussi inclure une valeur inconnue, avec une valeur de -1. Cela devient alors la valeur par défaut et peut parfois aider au débogage.