En C #, est-il possible de décorer un type Enum avec un attribut ou de faire autre chose pour spécifier quelle devrait être la valeur par défaut, sans avoir à changer les valeurs? Les nombres requis peuvent être gravés dans la pierre pour une raison quelconque, et il serait pratique d'avoir toujours le contrôle sur la valeur par défaut.
enum Orientation
{
None = -1,
North = 0,
East = 1,
South = 2,
West = 3
}
Orientation o; // Is 'North' by default.
int
s dans l'abstrait , simplement parce qu'elles se trouvent être implémentées en tant que types numériques. Nous pourrions implémenter des énumérations sous forme de chaînes, et cela ne changerait pas leur utilité. Je considère la réponse ici comme une limitation de l'expressivité du langage C #; la limitation n'est certainement pas inhérente à l'idée de «distinguer les valeurs d'un ensemble restreint».enum
s comme des constructions de niveau type, spécifiquement comme des types de somme (ou voir ici . Autrement dit, considérons chaque énumération comme un type distinct, où toutes les valeurs de ce type sont distinctes de toutes les autres valeurs d'énumération. Dans un tel état d'esprit, il est impossible pour les énumérations de partager une valeur, et en effet, cette abstraction se désagrège lorsque vous considérez que la valeur par défaut de0
mai ou peut ne pas être valide pour une énumération donnée, et est simplement à cornes de chaussure dans chaque énumération.Réponses:
La valeur par défaut pour un
enum
(en fait, n'importe quel type de valeur) est 0 - même si ce n'est pas une valeur valide pour celaenum
. Cela ne peut pas être changé.la source
La valeur par défaut de toute énumération est zéro. Donc, si vous souhaitez définir un énumérateur comme valeur par défaut, définissez-le sur zéro et tous les autres énumérateurs sur non-zéro (le premier énumérateur à avoir la valeur zéro sera la valeur par défaut de cette énumération s'il existe plusieurs énumérateurs). avec la valeur zéro).
Si vos énumérateurs n'ont pas besoin de valeurs explicites, assurez-vous simplement que le premier énumérateur est celui que vous souhaitez être l'énumérateur par défaut, car "Par défaut, le premier énumérateur a la valeur 0 et la valeur de chaque énumérateur successif est augmentée de 1." ( Référence C # )
la source
Si zéro ne fonctionne pas comme valeur par défaut appropriée, vous pouvez utiliser le modèle de composant pour définir une solution de contournement pour l'énumération:
puis vous pouvez appeler:
Remarque: vous devrez inclure la ligne suivante en haut du fichier:
Cela ne change pas la valeur par défaut réelle du langage C # de l'énumération, mais donne un moyen d'indiquer (et d'obtenir) la valeur par défaut souhaitée.
la source
else
déclaration comme suit:return default(TEnum);
. Premièrement, cela réduira lesEnum.GetValues(...).***
appels plus lents , en second lieu (et plus important), il sera générique pour tout type, même les non-énumérations. De plus, vous ne restreignez pas le code à utiliser uniquement pour les énumérations, donc cela corrigera en fait les exceptions potentielles lorsqu'il est utilisé sur des types non énumérés.La valeur par défaut d'une énumération correspond à l'énumération égale à zéro. Je ne crois pas que cela soit modifiable par attribut ou par d'autres moyens.
(MSDN dit: "La valeur par défaut d'une énumération E est la valeur produite par l'expression (E) 0.")
la source
Vous ne pouvez pas, mais si vous le souhaitez, vous pouvez faire un tour. :)
utilisation de cette structure comme énumération simple.
où vous pouvez créer pa == Orientation.East (ou toute valeur que vous voulez) par défaut
pour utiliser l'astuce elle-même, vous devez convertir int par code.
là l'implémentation:
la source
value + 1
, sinon maintenant vosdefault(Orientation)
retoursEast
. Rendez également le constructeur privé. Bonne approche.Une autre façon qui pourrait être utile - d'utiliser une sorte d'alias. Par exemple:
la source
Status s = default(Status);
ne fera partie d'aucun membre de statut, cars
elle aura la valeur de(Staus) 0
. Ce dernier est valide pour écrire directement, car les énumérations peuvent être converties en entiers, mais il échouera lors de la désérialisation, car le framework s'assure qu'une énumération est toujours désérialisée en un membre valide. Votre code sera parfaitement valide si vous changez la ligneNew = 10
enNew = 0
.En fait,
enum
la valeur par défaut de an est le premier élément duenum
dont la valeur est0
.Ainsi, par exemple:
la source
Console.WriteLine(Animals.Pony);
imprime "Cat")The default value of enum is the enummember equal to 0 or the first element(if value is not specified)
... Mais j'ai rencontré des problèmes critiques en utilisant enum dans mes projets et surmonté en faisant quelque chose ci-dessous ... Comment mon besoin était-il lié au niveau de la classe ...et obtenir le résultat attendu
Maintenant, que se passe-t-il si la valeur provient de DB ... Ok dans ce scénario ... passez la valeur dans la fonction ci-dessous et cela convertira la valeur enum ... sous la fonction gérée divers scénarios et c'est générique ... et croyez-moi, c'est très vite ..... :)
la source
La valeur par défaut pour un type d'énumération est 0:
" Par défaut, le premier énumérateur a la valeur 0 et la valeur de chaque énumérateur successif est augmentée de 1. "
" Le type de valeur enum a la valeur produite par l'expression (E) 0, où E est l'identificateur d'énumération. "
Vous pouvez consulter la documentation de l'énumération C # ici et la documentation de la table des valeurs par défaut C # ici .
la source
Si vous définissez l'énumération par défaut comme l'énumération avec la plus petite valeur, vous pouvez utiliser ceci:
Cela ne suppose pas que l'énumération a une valeur nulle.
la source
La valeur par défaut est la première de la définition. Par exemple:
Cela reviendra
His
la source
Si vous définissez la propriété sur null retournera Orientations.Aucun sur get. La propriété _orientation est nulle par défaut.
la source
Ensuite, dans le code, vous pouvez utiliser
la source