Edit: Il semble que la plupart des gens mal compromis ma question.
Je sais à quel point travaille Enum, et je sais binaire. Je me demande pourquoi em> les énums avec l'attribut [Flags] est conçu comme c'est le cas. P> Poste d'origine: p> cela pourrait être un duplicata, mais je n'ai trouvé aucun autre message, alors voila ici. em> p> Je parie qu'il y a eu une bonne justification derrière cela, je viens de trouver un peu sujette à un bug. p> ne serait-il pas plus logique s'il faisait quelque chose comme ça? p> Bien sûr .. je suis Pas tout à fait sûr comment il devrait gérer des drapeaux personnalisés comme celui-ci p> la spécification donne quelques directives p> Définir les constantes de dénombrement des pouvoirs de deux, c'est-à-dire 1, 2, 4, 8, etc. Cela signifie que les drapeaux individuels des constantes de dénombrement combinées ne se chevauchent pas. p>
blockquote> Mais cela devrait peut-être être fait automatiquement car je parie que vous ne voudrez jamais que mon premier exemple se produise. S'il vous plaît éclairer moi :) p> p>
6 Réponses :
Le premier élément d'une énumération est zéro à moins d'une autre valeur explicite. Il est souvent la meilleure pratique d'avoir une valeur nulle pour les énumérations de drapeaux car elle fournit un sens sémantique à la valeur zéro telle que "NO drapeaux" ou "désactivé". Cela peut être utile pour maintenir le code comme cela peut impliquer l'intention de votre code (bien que des commentaires y parviennent également).
Autre que cela, c'est vraiment à vous et à votre conception de savoir si vous avez besoin d'une valeur zéro ou non. p>
Lorsque les énumérations de drapeau ne sont toujours que des énumérations (le qui dit, il n'est pas déraisonnable d'imaginer une syntaxe pour les énumérations des drapeaux qui exigent tous Les combinaisons binaire sont placées à la fin de la définition de dénombrement ou sont marquées d'une manière ou d'une autre, de sorte que le compilateur sait comment gérer tout le reste. P> par exemple (en supposant un mot clé code> et que nous sommes dans l'hémisphère nord), P> avec cette syntaxe, le compilateur pourrait créer la valeur 0 elle-même et attribuer automatiquement des indicateurs aux autres valeurs. p> p> flagsattribute code> indique simplement au débogueur d'interpréter les valeurs comme combinaisons d'autres valeurs), la valeur suivante d'une énumération est toujours une autre que la valeur précédente. Par conséquent, vous devriez être explicite dans la spécification des valeurs de bits, car vous souhaiterez peut-être exprimer des combinaisons comme des bittes-ou comme des bittes d'autres valeurs. P>
Notez que votre devis indique seulement qu'il devrait toujours y avoir une valeur zéro pour les non-drapeaux Enums. Personnellement je suis en désaccord avec même ça ...
@Jon: Mise à jour pour supprimer toutes les ordures :) Merci de me garder honnête.
L'attribut drapeaux code> est uniquement utilisé pour formater les valeurs sous forme de valeurs multiples. Les opérations de bits fonctionnent sur le type sous-jacent avec ou sans l'attribut. p>
Il n'y a rien dans la spécification c # 3 annotée. Je pense qu'il peut em> être quelque chose dans la spécification annotée C # 4 - je ne suis pas sûr. (Je pense avoir commencé à écrire une telle annotation moi-même, mais ensuite l'a supprimé.) C'est bien pour des cas simples, mais dès que vous commencez à ajouter des drapeaux supplémentaires, il est un peu délicat: P> [Flags]
enum Features
{
Frobbing, // 1
Blogging, // 2
Widgeting, // 4
BloggingAndWidgeting = Frobbing | Blogging, // 6
Mindnumbing // ?
}
Une règle raisonnable et simple serait de désactiver la numérotation automatique pour [indicateurs] code> complètement.
S'il y a quelque chose de brisé dans C #, c'est l'énum de (maintenant que les tuples existent). La syntaxe d'énumérer les valeurs ENUM est laide, il n'ya aucun moyen d'appliquer des restrictions, etc.
L'attribut est [drapeaux] pas [drapeau] et il n'y a rien de magique à ce sujet. La seule chose à laquelle il semble affecter est la méthode de totrage. Lorsque [drapeaux] est spécifié, les valeurs sortent des virgules délimitées. C'est à vous de spécifier les valeurs de la rendre valide pour être utilisée dans un champ de bits. P>
Mettez simplement, ayant dit que, la page MSDN conception de drapeaux énumérations dit Ceci: p>
Utilisez des pouvoirs de deux pour un drapeau
les valeurs de l'énumération afin qu'ils puissent être
librement combiné en utilisant le bitwise ou
opération. p>
Important: si vous n'utilisez pas de pouvoirs de deux ou
combinaisons de pouvoirs de deux, bitwise
les opérations ne fonctionneront pas comme prévu. P>
blockQuote>
De même, la page pour le Définir les constantes de dénombrement des pouvoirs
de deux, c'est-à-dire 1, 2, 4, 8, et ainsi
au. Cela signifie que les drapeaux individuels dans
Les constantes de dénombrement combinées ne font pas
chevauchement. p>
blockQuote> drapeaux code> est un attribut. Il ne s'applique qu'après la création de l'énumération et ne modifie donc pas les valeurs attribuées à l'énumération. P>
FlagsAttribute code >
dit p>
en C, il est possible de (ab) utiliser le prétraiteur pour générer automatiquement des énumérations de puissance de deux. Si l'on a une macro make_things qui se développe à "make_thing (drapeau1) make_thing (drapeau2) make_thing (drapeau 3)", etc. Il est possible d'invoquer plusieurs fois de macro plusieurs fois, avec des définitions différentes de make_thing, de manière à obtenir une puissance de deux séquence de noms de drapeau ainsi que d'autres friandises. P>
Par exemple, commencez par définir make_thing (x) comme "linear_enum _ ## x" (y compris la virgule), puis utilisez une instruction ENUM pour générer une liste des énumérations (y compris, en dehors de la macro make_things, lineear_num_items). Ensuite, créez une autre énumération, cette fois avec make_thing (x) défini comme "flag_enum _ ## x = 1 <
Certaines des choses qui peuvent être faites de cette façon, avec indicateur et valeurs linéaires sont automatiquement maintenues en synchronisation; Le code peut faire de belles choses comme "Si (Thingie [linear_enum_foo] Thing_Errors | = flag_eum_foo;" (Utilisation des valeurs linéaires et de drapeaux). Malheureusement, je ne sais aucun moyen de faire quelque chose à distance similaire dans c # ou vb.net. P >
1 << 1 code> est égal à
2 code> comme le
1 code> est décalé par une position à gauche!
1 << 0 code> est égal à
1 code>.
Aie. Erreur stupide :/
Vous avez demandé à l'une des nombreuses questions que je veux poser. Je préfère aussi que la langue elle-même fournit la valeur automatique de SQ pour les drapeaux. Il fonctionne également si l'équipe DEV ajoutez un constructeur à l'énumération ou de définir une formule pour définir la valeur de l'énum. Pour l'instant, nous devons le faire manuellement. triste.