Comment savoir si une propriété enum a été définie? C #
J'ai une classe avec un enum propriété comme suit:
public class Foo
{
public Color ColorType {get;set;}
}
public enum Color
{
Red,
Green,
}
Maintenant cette classe peut être initialisé comme suit:
var foo = new Foo();
sans ColorType bien jamais être ensemble.
Maintenant, je suis en train de créer une méthode et d'effectuer des actions sur celle de savoir si enum n'a jamais été définie ou pas, par exemple, j'ai une méthode
private void checkEnum(Foo foo)
{
if(foo.ColorType !=null)
{
//perform these actions
}else
{
//perform those actions
}
}
cependant je reçois un avertissement disant que la valeur ne sera jamais nulle et sur d'autres recherches, si l'enum est jamais définie si la valeur par défaut sera la première valeur qui serait
être Rouge dans mon cas, j'ai pensé à l'ajout d'une valeur à mon enum qui serait "non définie" et que la valeur de la première, donc si il n'en a pas été réglée, alors
l'enum aura la valeur 'non défini', est-il une meilleure façon de faire cela, ma méthode proposée semble comme il pourrait être gênant
source d'informationauteur user2341534
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser une des deux méthodes: par défaut valeur d'énumération ou une nullable enum.
Par défaut valeur d'enum
Depuis un enum est soutenu par un nombre entier, et
int
zéro par défaut, l'enum toujours initialiser par défaut à la valeur équivalente à zéro. Sauf si vous avez explicitement attribuer les valeurs de l'enum, la première valeur est toujours égale à zéro, deuxième, et ainsi de suite.Nullable enum
L'autre façon de gérer non affectés de l'enum est d'utiliser un nullable champ.
Vous pouvez faire en sorte que le domaine privé est nullable mais la propriété n'est pas.
E. g.
De cette façon, si couleur == null vous savez qu'il n'a pas été encore fixé et vous êtes également l'arrêt de l'utilisateur à partir de la mise à
null
(ouundefined
comme d'autres réponses à préciser). Sicolor
estnull
vous avez 100% de certitude que l'utilisateur n'a pas défini de jamais il.Seul hic, c'est la valeur par défaut retournée par la
get
mais vous pouvez toujours lancer une exception si elle correspond mieux à votre programme.Vous pouvez également prendre un peu plus loin en faisant en sorte que le
set
seulement définit le champ si la valeur n'est pas égale à la valeur par défaut (en fonction de votre cas d'utilisation):Vous avez deux options réelles. La première consiste à ajouter une valeur non définie enum. Ce sera la valeur par défaut avant de la propriété est initialisée.
1)
Avec votre chèque comme:
2) Sinon, vous ne pouvez pas ajouter de la valeur indéfinie et juste faire de la propriété
Nullable
Et effectuer votre enregistrement comme:
Les énumérations sont Types De Valeurce qui signifie qu'ils ne sont pas des références à un objet stocké quelque part d'autre, et par conséquent, ils ne peuvent pas être
null
. Ils ont toujours une valeur par défaut tout commeint
qui sera par défaut à zéro lors de la création. Je suggère deux approches:Ajouter un autre enum entrée appelée par exemple,
None
avec une valeur égale à zéro. De cette façon, votre enum valeur par défautNone
lors de la création. Ensuite, vous pouvez vérifierif(foo.ColorType != Color.None)
.Faire de votre
Color
propriété nullable l'un comme:public Color? ColorType { get; set; }
. Maintenant, il sera par défaut ànull
et peut être affectée de la valeurnull
. Lire plus à propos denullable
types ici: MSDN - Types Nullables (C#).Comme vous l'avez découvert, les énumérations en C# sont des types de valeur (ce sont essentiellement des entiers) pas de référence types afin qu'ils ne sera pas par défaut à NULL, mais plutôt la plus faible valeur entière dans l'énumération. Ne perdez pas de vue cette relation lorsque vous traitez avec les énumérations que c'est une de leurs plus utiles attributs. Rappelez-vous toujours que si vous déclarez explicitement ou non,
équivaut à:
Mais vous pouvez bien sûr donner à chaque membre d'énumération n'importe quelle valeur entière que vous le souhaitez.
Quant à savoir si ou non il ya une meilleure façon de le faire, tout dépend de ce que "cela" est, s'il n'y a rien de mal avec votre suggestion d'utiliser simplement l'enum ci-dessous le programme d'installation:
Généralement vous voulez utiliser les énumérations lorsque vous avez un décidément fini et ensemble discret de valeurs possibles que vous voulez être en mesure de sélectionner à partir de par son nom. Par exemple, dire que j'ai une méthode qui prend l'une des 4 directions cardinales (Nord, Est, Sud, Ouest) en tant que paramètre. Je décide que je veux le numéro de chacune des directions, dans le sens horaire, en commençant à 0 pour le Nord.
Maintenant, au lieu d'avoir ma prise de fonction d'un paramètre de type entier et en espérant que je vais me souvenir de ce que chaque numéro renvoie à la, je peux maintenant avoir la prise de fonction d'un membre d'énumération en tant que paramètre et de savoir immédiatement quelle direction je m'occupe. Par exemple:
lit beaucoup plus facile que:
enum
est un type de valeur de sorte qu'il ne peut pas être nulle, et le stockage est généralement un entier. Si vous voulez une valeur non définie pour votre type, vous pouvez avoir