Si un Enum commencer par un 0 ou un 1?
Imaginer je l'ai défini l'Enum ci-dessous:
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
Quelle est la meilleure pratique à utiliser enum? Faut-il commencer avec 1
comme l'exemple ci-dessus, ou de démarrer avec 0
(sans les valeurs explicites) comme ceci:
public enum Status : byte
{
Inactive,
Active
}
- Avez-vous vraiment besoin de nombre explicitement à tous?
- Les énumérations ont été créés juste pour que ce genre de choses ne serait pas important.
- pourquoi ne pas utiliser un booléen?
- arrgh pas! Mieux utiliser un enum lorsque vous pense est un booléen va faire que d'utiliser un booléen quand vous pensez à un enum.
- en raison de la FileNotFound de valeur, bien sûr
- stackoverflow.com/questions/1240739/...
- Je suis d'accord que la question est liée à ce problème (même si c'est spécifiquement sur les paramètres de la fonction), mais je pense qu'il y a également de solides arguments contre l'utilisation de booléen pour les membres / les variables dans de nombreux cas. Il y a de les choses qui véritablement ne disposez que de 2 membres et n'aura jamais un 3ème, mais une fois que vous obtenez à partir du "monde réel" dans le logiciel de domaine, ils sont en fait assez rare, sauf pour calculé les conditions (pour qui les booléens sont bien sûr exactement).
- Type de sécurité est une autre considération.
- xkcd.com/163 s'applique à l'enum de même mieux que de les indices de tableau.
- Que XKCD s'applique à cette façon 🙂 C'est assez absurde...
- vous ne devez jamais utiliser un
boolean
pour quelque chose qui n'est pas en soi un "oui" ou " non " à la question, même si elle n'a que deux valeurs possibles. Côté de considérer qu'il peut ajouter un autre Statut de la semaine prochaine appelé "l'Attente", etc., il vient de rendre le code plus lisible et compréhensible pour les humains. -- (Juste parce que vous pouvez activer quelque chose dans un "oui" ou " non " à la question ne signifie pas que vous devriez. - Si quelqu'un vous demande votre statut, vous ne pouvez pas dire "oui".) - Oui je recommanderais numérotation des enums explicitement. La raison en est que toute réorganisation de l'énumération des éléments de changer leurs valeur. Maintenant, si vous stocker ces valeurs dans une base de données, les données ne seront pas synchronisées avec le code. Si ils sont explicites, le re-commande de ne pas changer leurs valeurs.
- pas vrai. Les valeurs sont importantes, ils ont été créés de sorte que vous pouvez avoir des collections de valeurs significatives, sans avoir à disputer quelques consts ensemble et de créer l'association vous-même. Pas de départ à 0 est un bon moyen d'établir qu'ils doivent être explicitement définis et de prévenir les erreurs où une valeur non semble être intentionnellement.
Vous devez vous connecter pour publier un commentaire.
Cadre Des Lignes Directrices De Conception:
switch
les déclarations qu'il va passer à ladefault
l'article, où je jette unInvalidEnumArgumentException
. Sinon, un programme peut-être involontairement continuer à fonctionner avec le zéro de la valeur d'une énumération, qui peut être valable et passer inaperçu.None = 0
en haut; Vous pouvez faire le début abandonne dans votre code de cette façon (c'est à direif (value == MyFlags.None) { return; }
, etc.)Bien, je suppose que je suis en désaccord avec la plupart des réponses qui disent pas explicitement nombre d'eux. J'ai toujours explicitement nombre, mais c'est parce que dans la plupart des cas, j'arrive à la fin de persistance dans un flux de données où elles sont stockées sous forme d'une valeur entière. Si vous n'avez pas ajouter explicitement les valeurs et ensuite ajouter une nouvelle valeur que vous pouvez briser la sérialisation et puis ne pas être en mesure de charger des vieux objets persistants. Si vous allez faire n'importe quel type de magasin persistant de ces valeurs, alors je vous recommande fortement de définir explicitement les valeurs.
[Flags]
enum que lorsque vous affectez les valeurs que vous le faire par des puissances de deux, au lieu de simplement incrémenter eux.Une énumération est un type de valeur et sa valeur par défaut (par exemple pour un champ Enum dans une classe) sera 0 si non initialisé explicitement.
Donc en général, vous voulez avoir 0 comme une constante définie (par exemple, Inconnue).
Dans votre exemple, si vous voulez
Inactive
par défaut, il devrait avoir la valeur zéro. Sinon, vous pourriez envisager l'ajout d'une constanteUnknown
.Certaines personnes ont recommandé de ne pas spécifier explicitement des valeurs constantes. Sans doute de bons conseils dans la plupart des cas, mais il y a certains cas où vous voulez le faire:
Drapeaux des enums
Les énumérations dont les valeurs sont utilisées dans l'interopérabilité avec les systèmes externes (p. ex. COM).
[Flags] enum MyFlags { None = 0, A, B, Both = A | B, /* etc. */ }
, c'est bien plus lisible, que[Flags] enum MyFlags { None = 0, A = 1, B = 2, Both = 3, /* etc */ }
.)[Flags] enum MyFlags { None=0, A, B, C }
entraînerait[Flags] enum MyFlags { None=0, A=1, B=2, C=3 }
, alors que, pour les Drapeaux enum vous souhaitez généralement C=4.Sauf si vous avez une raison particulière de le changer, de laisser les énumérations avec leurs valeurs par défaut, qui commence à zéro.
Je dirais que la meilleure pratique est de pas qu'elle soit implicite - qui commence à partir de 0. Depuis sa implicite ses la préférence de langue qui est toujours bon à suivre 🙂
Je voudrais commencer un booléen de type enum avec un 0.
Sauf si "Inative" signifie autre chose que "Inactif" 🙂
Il conserve la norme pour ceux.
Je dirais, ça dépend de comment vous les utilisez. À des fins de repérage enum c'est une bonne pratique d'avoir 0 pour
None
valeur, comme ça:Lorsque votre enum est susceptible d'être relié à une base de données de la table de recherche, j'aimerais commencer avec 1. Il ne devrait pas avoir beaucoup d'importance pour professionnellement code écrit, mais cela augmente la lisibilité.
Dans d'autres cas, je préfère le laisser tel qu'il est, sans donner les soins qu'ils commencent par 0 ou 1.
Sauf si vous avez une bonne raison pour utiliser les valeurs brutes, vous ne devriez jamais être à l'aide de valeurs implicites et de référencement avec
Status.Active
etStatus.Inactive
.Le hic, c'est que vous pourriez vouloir stocker des données dans un fichier plat ou DB, ou de l'utilisation d'un fichier plat ou DB que quelqu'un d'autre a créé. Si vous réalisez vous-même, faire en sorte que la numérotation correspond à ce que l'Enum est utilisé pour.
Si les données n'est pas la vôtre, bien sûr, vous allez vouloir l'utiliser quelle que soit l'origine dev avait utilisé comme un système de numérotation.
Si vous prévoyez sur l'utilisation de l'énumération que d'un jeu d'indicateurs, il est une simple convention qui en vaut la suivante:
Les valeurs doivent être des puissances de deux et peut être exprimée à l'aide de décalage de bit opérations.
None
, évidemment devrait être0
, maisAll
est moins évidemment-1
.~0
est la négation binaire de0
et les résultats dans un numéro qui a tous les bits mis à1
, ce qui représente une valeur de-1
. Pour la composition de drapeaux (souvent utilisé pour des raisons de commodité) d'autres valeurs peuvent être fusionnés à l'aide de l'opérateur or|
.N'attribuez pas des numéros.
Juste l'utiliser comme il doit être utilisé.
Si vous commencer à 1, alors vous pouvez facilement obtenir un nombre de choses.
Si vous commencez à 0, puis d'utiliser la première comme une valeur non initialisée choses.
Si non spécifiée, la numérotation commence à 0.
Il est important d'être explicite depuis les énumérations sont souvent sérialisé et stocké dans un int, pas une chaîne de caractères.
Pour tout enum stockées dans la base de données, nous avons toujours explicitement nombre les options permettant de prévenir les déplacements et la réaffectation au cours de l'entretien.
Selon Microsoft, la convention est d'utiliser la première option zéro pour représenter un non initialisée ou la plus commune de la valeur par défaut.
Ci-dessous est un raccourci pour démarrer la numérotation à 1 au lieu de 0.
Si vous souhaitez définir des valeurs d'indicateur afin d'utiliser les bits les opérateurs sur les valeurs de l'enum, ne pas commencer la numérotation à la valeur zéro.
Tout d'abord, sauf si vous spécifiez des valeurs spécifiques pour une raison (la valeur numérique a de sens que quelque part d'autre, c'est à dire La Base de données ou de services externes), puis ne pas spécifier des valeurs numériques à tous les et laissez-les être explicite.
Deuxième de tous, vous devriez toujours avoir une valeur de zéro (en non-drapeaux des enums). Cet élément sera utilisé comme valeur par défaut.
Ne commence pas à 0, sauf si il y a une raison, comme les utilisant comme des indices d'un tableau ou d'une liste, ou s'il y a une autre raison pratique (comme l'utilisation dans des opérations bit à bit).
Votre
enum
devrait commencer exactement là où il faut. Il n'a pas besoin d'être séquentielle, soit. Les valeurs, si elles sont explicitement définies, doivent tenir compte de certaines de sens sémantique ou des considérations d'ordre pratique. Par exemple, unenum
des "bouteilles sur le mur" doivent être numérotés de 1 à 99, tandis qu'unenum
pour des puissances de 4 devrait probablement commencer à 4 et continuer avec 16, 64, 256, etc.En outre, l'ajout d'une valeur zéro de l'élément à la
enum
doit uniquement être effectuée si elle représente un état valide. Parfois, "aucun", "inconnu", "manque", etc. sont des valeurs valides, mais de nombreuses fois ils ne le sont pas.Je voudrais commencer ma enums à 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 aider au débogage parfois.