Je comprends comment les énums fonctionnent dans C # et que l'attribut des drapeaux apporte à la table.
J'ai vu cette question, ici . Qui recommande la première saveur, mais ne fournit aucune raison / justification pour cela. P>
existe une différence dans la manière dont ces deux sont définies, est un meilleur que l'autre? Quels sont les avantages à utiliser le premier synaxe comme au lieu de la seconde? J'ai toujours utilisé la deuxième saveur lors de la définition des drapeaux Type Enums ... ai-je déjà fait de mal tout ce temps? P>
[Serializable] [Flags] public enum SiteRoles { User = 1, Admin = 2, Helpdesk = 4 }
3 Réponses :
afaik c'est un débat de lisibilité. Certains diraient que le premier est plus lisible parce que vous avez l'index réel du drapeau sur le côté droit du «<<». P>
Ce n'est pas un tour de compilateur. Quelle est la différence entre helpdesk = 1 << 2, helpdesk = 4 ou helpdesk = 3 + 1. C'est juste une expression qui est évaluée.
Je suppose que je vois cela comme profiter du compilateur et donc un tour du compilateur. Votre point est bien pris.
L'avantage principal avec le premier est que vous n'avez pas besoin de calculer les valeurs correctes pour chaque drapeau car le compilateur le fera pour vous. En dehors de cela, ils sont les mêmes. P>
Oui, 1 << N est une constante de sorte que le compilateur doit le calculer, ce qui pourrait être moins d'erreur suure de 1,2,4,8 ... Vous pouvez également utiliser hexagonal E.G. 0x1, 0x10, 0x100 ...
Bien que vous puissiez être plus intéressé par des valeurs hexagonales telles que 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80.
Considérons des échantillons plus complexes:
[Flags] public enum SiteRoles { User = 1 << 12, Admin = 1 << 13, Helpdesk = 1 << 15, AdvancedUser = User | Helpdesk, //or (1<<12)|(1<<13) } [Flags] public enum SiteRoles { User = 4096, //not so obvious! Admin = 8192, Helpdesk = 16384, AdvancedUser = 12288, //! } [Flags] public enum SiteRoles { User = 0x1000, //we can use hexademical digits Admin = 0x2000, Helpdesk = 0x4000, AdvancedUser = 0x3000, //it much simpler calculate binary operator OR with hexademicals }
Le code IL produit pour ces 2 Code Fragmens est le même.
Repérer le bogue dans ce code: Backupopérator = 1073714824. Vous pouvez éviter le bogue en premier lieu en disant Backupopérator = 1 << 30
Merci pour l'info, j'utiliserai la première approche, car il semble mieux pour tous sauf les cas les plus simples.