C # Enums: Valeur nullable ou «inconnue»?

Si j’ai un cours avec un membre enum et que je veux pouvoir représenter des situations où ce membre n’est pas défini, quel est le meilleur?

a) Déclarez le membre comme nullable dans la classe en utilisant les 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 peux pas vraiment voir de pour et contre les uns ou les autres; mais peut-être l’un est préférable à l’autre?

Utilisez certainement un type de valeur nullable – c’est ce qu’ils sont pour. Il indique explicitement votre intention. Cela signifie également que vous pouvez utiliser Enum.IsDefined (ou l’équivalent de Unconstrained Melody si vous voulez que la sécurité de type générique) détermine facilement si une valeur particulière est une valeur réelle sans se soucier du “faux” aussi.

Je suis d’accord avec archimed7592 qu’il existe une différence réelle entre la valeur absente et la valeur “Inconnu”.

Exemple:

“Quel est votre groupe sanguin?”

  • Null = valeur absente -> la question n’a pas été répondue -> poser la question

  • “Inconnu” -> le patient indique qu’il ne sait pas -> commander un test de laboratoire pour le groupe sanguin

Vous devez simplement décider si vous avez besoin d’une valeur pour représenter des valeurs inconnues ou vous avez besoin 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 de énumération supplémentaire semble être une bonne solution.

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

N’oubliez pas qu’il n’y a rien de mal à avoir à la fois un membre enum “inconnu” et un enum en même temps.

HTH.

ÇA DÉPEND!

Bill Wagner a énuméré quelques bonnes raisons d’append un enum lorsque cela est logique. Je vous suggère de trouver l’article complet, mais voici un aperçu:

Point 8: Assurez-vous que 0 est un état valide pour les types de valeur

L’initialisation du système .NET par défaut définit tous les objects sur tous les 0. Il est impossible d’empêcher d’autres programmeurs de créer une instance d’un type de valeur initialisé à tous les 0. Faites-en la valeur par défaut pour votre type.

Un cas particulier est la énumération. Ne créez jamais une énumération qui n’inclut pas 0 comme choix valide. Toutes les énumérations sont dérivées de System.ValueType. Les valeurs de l’énumération commencent à 0, mais vous pouvez modifier ce comportement …

À présent, les utilisateurs doivent sélectionner un type dans un ComboBox ou aucun type ne peut être sélectionné. J’utilise un enum avec un atsortingbut [Description("a description")] comme object à sélectionner. Si aucun / Unknown est un choix naturel pour un enum, alors je l’utiliserais pour représenter que rien n’est sélectionné. Sinon, je vais utiliser un Nullable .

Si c’est nullable, vous l’obtiendrez en tant que valeur par défaut, vous obtiendrez des exceptions si vous avez essayé de l’utiliser quand null (ce qui est une bonne chose!)

Tout change si l’atsortingbut est atsortingbué avec l’atsortingbut [Flags] .

  [Flags] enum FlagsEnum { None = 0, First = 1, Second = 2, Third = 4, FirstAndThird = 5 }