Imaginez 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 l'exemple ci-dessus ou commencer par 0
(sans les valeurs explicites) comme ceci:
public enum Status : byte
{
Inactive,
Active
}
Réponses:
Directives de conception du cadre :
Directives de conception de cadre / conception d'énumérations d'indicateur :
la source
switch
instructions, elle passera à ladefault
section, où je lance unInvalidEnumArgumentException
. Sinon, un programme peut involontairement continuer à s'exécuter avec la valeur zéro d'une énumération, qui peut être valide et passer inaperçue.Eh bien, je suppose que je ne suis pas d'accord 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ù ils sont stockés sous forme de valeur entière. Si vous n'ajoutez pas explicitement les valeurs, puis ajoutez une nouvelle valeur, vous pouvez interrompre la sérialisation et ne pas pouvoir charger avec précision les anciens objets persistants. Si vous envisagez de faire un type de stockage persistant de ces valeurs, je vous recommande vivement de définir explicitement les valeurs.
la source
Un Enum est un type 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 avoir 0 comme constante définie (par exemple, Inconnu).
Dans votre exemple, si vous voulez
Inactive
être la valeur par défaut, il doit avoir la valeur zéro. Sinon, vous pouvez envisager d'ajouter une constanteUnknown
.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:
Énumérations des drapeaux
Énumérations dont les valeurs sont utilisées en interopérabilité avec des systèmes externes (par exemple COM).
la source
[Flags] enum MyFlags { None = 0, A, B, Both = A | B, /* etc. */ }
- dire est beaucoup plus lisible que[Flags] enum MyFlags { None = 0, A = 1, B = 2, Both = 3, /* etc */ }
.)[Flags] enum MyFlags { None=0, A, B, C }
cela entraînerait[Flags] enum MyFlags { None=0, A=1, B=2, C=3 }
, alors que pour une énumération Flags, vous voudriez généralement C = 4.Sauf si vous avez une raison spécifique de le modifier, laissez les énumérations avec leurs valeurs par défaut, qui commencent à zéro.
la source
Je dirais que la meilleure pratique est de ne pas les numéroter et de le laisser être implicite - ce qui commencerait à partir de 0. Puisque c'est implicite, c'est la préférence de langue qui est toujours bonne à suivre :)
la source
Je commencerais une énumération de type booléen avec un 0.
Sauf si "Inatif" signifie autre chose que "Inactif" :)
Cela conserve la norme pour ceux-ci.
la source
Je dirais que cela dépend de la façon dont vous les utilisez. Pour marquer enum, il est recommandé d'avoir 0 pour
None
valeur, comme ça:Lorsque votre énumération est susceptible d'être mappée à une table de recherche de base de données, je la commencerais par 1. Cela ne devrait pas avoir beaucoup d'importance pour le code écrit par des professionnels, mais cela améliore la lisibilité.
Dans d'autres cas, je le laisserais tel quel, sans me soucier de savoir s'ils commencent par 0 ou 1.
la source
À moins que vous n'ayez une bonne raison d'utiliser les valeurs brutes, vous ne devriez jamais utiliser que des valeurs implicites et les référencer avec
Status.Active
etStatus.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 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 vous appartiennent pas, bien sûr, vous voudrez utiliser tout ce que le développeur d'origine avait utilisé comme schéma de numérotation.
Si vous prévoyez d'utiliser Enum comme un ensemble d'indicateurs, il existe une convention simple qui vaut la peine d'être suivie:
Les valeurs doivent être des puissances de deux et peuvent être exprimées à l'aide d'opérations de décalage de bits.
None
, devrait évidemment être0
, maisAll
est moins évident-1
.~0
est la négation binaire de0
et donne un nombre dont chaque bit est défini sur1
, 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 de l'opérateur binaire ou|
.la source
N'attribuez aucun numéro. Utilisez-le simplement comme il est censé être utilisé.
la source
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 int, pas d'une chaîne.
Pour toute énumération stockée dans la base de données, nous numérotons toujours explicitement les options pour empêcher le décalage et la réaffectation pendant 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.
Vous trouverez ci-dessous un raccourci pour commencer la numérotation à 1 au lieu de 0.
Si vous souhaitez définir des valeurs d'indicateur afin d'utiliser des opérateurs de bits sur les valeurs d'énumération, ne commencez pas la numérotation à la valeur zéro.
la source
Si vous commencez à 1, vous pouvez facilement compter vos affaires.
Si vous commencez à 0, utilisez le premier comme valeur pour les choses non initialisées.
la source
Tout d'abord, à moins que vous ne spécifiiez des valeurs spécifiques pour une raison (la valeur numérique a un sens ailleurs, c'est-à-dire la base de données ou un service externe), ne spécifiez pas du tout de valeurs numériques 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.
la source
Ne les démarrez pas à 0 sauf s'il y a une raison de le faire, comme les utiliser comme index dans un tableau ou une liste, ou s'il y a une autre raison pratique (comme les utiliser dans des opérations au niveau du bit).
Votre
enum
devrait commencer exactement là où il le faut. Cela n'a pas besoin non plus d'être séquentiel. Les valeurs, si elles sont explicitement définies, doivent refléter une signification sémantique ou une considération pratique. Par exemple, unenum
des "bouteilles sur le mur" doit être numéroté de 1 à 99, tandis qu'unenum
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 au
enum
ne doit être effectué que s'il représente un état valide. Parfois, «aucune», «inconnue», «manquante», etc. sont des valeurs valides, mais souvent elles ne le sont pas.la source
J'aime commencer mes énumérations à 0, car 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.
la source