the Documentation MSDN pour le drapeau Définir les constantes de dénombrement des pouvoirs de deux, c'est-à-dire 1, 2, 4, 8,
etc. Cela signifie les drapeaux individuels en énumération combinée
Les constantes ne se chevauchent pas. P>
BlockQuote> ... Et bien sûr, j'essaie toujours de me souvenir de le faire. Cependant, rien n'applique que si vous créez simplement une énumération, le «de base» comme ... p> ... il ne se comportera pas comme prévu. Pour lutter contre cela, je cherche une sorte d'analyse de code statique (comme FXCop < / a>) qui peut me prévenir quand un énumé comme celui ci-dessus existe dans mon code. Le tout avertissement de ce type que je pouvais trouver était ' CA1008: Enums devrait avoir une valeur zéro a > '- qui est également utile pour concevoir les drapeaux énumérant correctement mais ne suffit pas. P> Quelle est la meilleure façon de trouver des drapeaux mal conçus de manière incorrecte Enums dans mon code? Plus la solution est automatisée, mieux c'est. P> p> < / code> attribut dit que vous devriez:
3 Réponses :
Parfois, vous voulez avoir un drapeau enum qui représente plusieurs options; Dans des cas comme ça, ce n'est pas une erreur. Voici un exemple courant: peut-être en raison de la nécessité de soutenir des cas comme ceux-ci, c'est pourquoi un compilateur ne provoque pas d'avertissement ou d'erreur. P> P>
Je peux voir des raisons pour lesquelles le compilateur ne le fait pas (réfléchir également à la compatibilité à l'arrière, à la complexité injustifiée, etc.) Je vais donc bien que vous n'obtiens pas un avertissement de compilateur. Mais je cherche toujours un moyen d'être averti. Dans des cas comme la vôtre, l'utilisation est valide, vous pouvez désactiver l'inspection avec quelque chose comme l'attribut SuppressMessage code>.
Vous pouvez également avoir plus d'indicateurs élaborés. Par exemple {vue = 1, alter = 2, action = 4 | Vue | Alter} code>: Ainsi pour action un élément dont vous avez besoin de vue et de modifier; en plus du droit lui-même.
Je n'ai jamais essayé moi-même, mais vous pourriez peut-être écrire une règle personnalisée pour FXCop. P>
Vérifiez Analyse FXCOP et code: rédaction de vos propres règles personnalisées . P>
Merci, cela semble très prometteur. Je pourrais rester avec la réponse de Jon Skeet simplement parce que je pense que cela sera plus rapide à court terme pour écrire un test de l'unité au lieu d'apprendre à écrire une règle FXCOP personnalisée.
Comme Jacob le dit, il peut être utile d'avoir des mélanges de drapeaux ... mais éventuellement que vous puissiez indiquer que votre détection ne vous dérange pas. P>
Il ne devrait pas être trop difficile d'écrire un test de l'unité qui passe chaque énumé dans une assemblée décorée avec Vous pouvez potentiellement avoir quelque chose comme un attribut Je sais que ce n'est pas aussi bon qu'un chèque de temps de compilation, mais en supposant que vous exécutez déjà des tests régulièrement, il est assez proche. P> [drapeaux] code> et vérifie qu'il y a une valeur pour 0 (éventuellement en veillant à ce qu'on appelle son appelé
Aucun code> ou
par défaut code>) et que toutes les autres valeurs définies (à partir de
Enum.getvalues () code>) est une puissance de deux. Vous pouvez vérifier cela en utilisant
si ((x & (x - 1)) == 0) code>. P>
[combinaison] code> pour indiquer des valeurs conçues pour être des combinaisons ... ils pourraient même indiquer les noms de drapeau des drapeaux pour être des combinaisons, de sorte que Vous pouvez vérifier cela aussi. P>
Je suppose que je n'aurais pas dû ne pas avoir réfléchi «à l'intérieur de la boîte» de l'analyse de code statique. Un test unitaire comme celui-ci devrait être assez facile et me donner presque le même résultat final.