63 votes

Enumères C #: Nullable ou Valeur 'inconnue'?

Si j'ai une classe avec un membre enum et que je veux pouvoir représenter des situations dans lesquelles ce membre n'est pas défini, quelle est la meilleure?

a) Déclarez le membre comme pouvant être nullable dans la classe à l'aide de types nullables. Par exemple:

 public SomeEnum? myEnum;
 

b) Ajoutez une valeur par défaut inconnue à l'énumération. Par exemple:

 public enum SomeEnum {
    Unknown,
    SomeValueA,
    SomeValueB,
    SomeValueC,
}
 

Je ne vois pas vraiment les principaux avantages / inconvénients dans les deux cas; mais peut-être que l'un est préférable à l'autre?

62voto

Jon Skeet Points 692016

Utilisez certainement un type de valeur nullable - c'est ce à quoi ils sont destinés. Il énonce explicitement votre intention. Cela signifie également que vous pouvez utiliser Enum.IsDefined (ou l’équivalent de Melody sans contrainte si vous voulez une sécurité de type générique) pour déterminer facilement si une valeur donnée est une valeur réelle sans vous soucier de la valeur "fictive".

19voto

Je suis d'accord avec archimed7592 pour dire qu'il existe une réelle différence entre la valeur absente et la valeur "inconnue".

Exemple:

"Quel est votre groupe sanguin?"

  • Null = valeur absente -> la question n'a pas de réponse -> poser la question

  • "Inconnu" -> le patient indique qu'il ne sait pas -> demander un test de laboratoire pour le groupe sanguin

7voto

archimed7592 Points 485

Vous devez simplement décider si vous avez besoin d'une valeur représentant des valeurs inconnues ou d'un moyen de représenter l'absence de toute valeur.

Dans le cas où il est nécessaire de représenter des valeurs inconnues, un membre enum supplémentaire est une bonne solution.

En cas de nécessité de représenter l'absence de toute valeur, rendez-la nulle.

Gardez à l'esprit qu'il n'y a rien de mal à avoir à la fois un membre enum "inconnu" et l'enum lui-même pouvant être annulés en même temps.

HTH.

5voto

Hamish Grubijan Points 2078

ÇA DÉPEND!

Le projet de loi Wagner a énuméré quelques bonnes raisons d'ajouter un Indéfini enum lorsque cela a du sens. Je vous suggère de vous trouver le point, mais voici un aperçu:

Article 8: Veiller à ce Que 0 Est un État Valide pour les Types de Valeur

La valeur par défaut .NET de l'initialisation du système jeux de tous les objets de tous les 0. Il n'existe aucun moyen pour empêcher d'autres programmeurs de créer une instance d'un type de valeur est initialisée à 0. Faire que la valeur par défaut pour le type de.

Un cas spécial est enums. Ne jamais créer une enum qui ne comprennent pas 0 comme un choix valable. Tous les énumérations sont dérivées à partir du Système.ValueType. Les valeurs de l'énumération commence à 0, mais vous pouvez modifier ce comportement...

Maintenant, j'ai une situation où les utilisateurs ont besoin pour sélectionner un type à partir d'une zone de liste déroulante, ou ils peuvent avoir aucun type sélectionné. Je suis en utilisant un enum avec un [Description("a description")] en tant qu'attribut de l'objet sélectionné. Si aucun/Inconnu est un choix naturel pour un enum, alors je voudrais l'utiliser pour représenter que rien n'est sélectionné. Sinon, je vais utiliser un Nullable<MyEnum>.

2voto

Si c'est nullable, vous l'obtiendrez comme valeur par défaut, vous obtiendrez des exceptions si vous essayez de l'utiliser quand null (ce qui est une bonne chose!)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X