Question

Pour permettre différentes options de formatage sur une méthode qui affiche un article, j'ai créé une énumération qui peut être transmise pour spécifier son mode d'affichage.

[Flags]
private enum NewsStyle
{
    Thumbnail = 0,
    Date = 1,
    Text = 2,
    Link = 4,
    All = 8
}

string FormatNews( DataRow news, NewsStyle style )
{
    StringBuilder HTML = new StringBuilder();

    // Should the link be shown
    if ( ((newsStyle & NewsStyle.All) == NewsStyle.All || (newsStyle & NewsStyle.Link) == NewsStyle.Link))
    {
                HTML.AppendFormat("<a style=\"text-decoration:none; color: rgb(66, 110, 171);\" href=\"ViewStory.aspx?nsid={0}\">",
                                  UrlEncode(newsStory["NewsStoryID"].ToString()));
    }

    // Etc etc...
}

// So to call the method...
Response.Write( FormatNews( news, NewsStyle.Date | NewsStyle.Text ) );

Le problème est que je ne peux faire fonctionner le code que si je spécifie manuellement les valeurs dans l'énum, ??sinon l'opération de vérification d'énum au niveau du bit ne fonctionne pas correctement.

J'ai toujours suivi la règle de laisser .net gérer l'attribution de valeurs aux enums - s'agit-il d'une exception géniuine?

Était-ce utile?

La solution

Oui, c'est une véritable exception. Les énumérations sont par défaut des valeurs attribuées à partir de 0, chacune étant supérieure de 1 à la valeur précédente, quels que soient les FlagsAttribute . (Il existe bien sûr des règles plus élaborées pour spécifier manuellement certaines valeurs & # 8211; voir la Documents MSDN )

Bien qu'il soit peu judicieux de faire en sorte qu'une énumération de drapeaux obtienne automatiquement des valeurs par deux, je vois les raisons pour lesquelles il est probablement préférable de ne pas le faire:

Il est parfaitement raisonnable d'avoir une énumération comme celle-ci:

[Flags]
enum Foo
{
    None,
    Bar,
    Baz, 
    BarAndBaz
} 

Cela nécessite bien sûr que les valeurs soient 0, 1, 2 et 3 pour être sensibles.

Il serait assez contre-intuitif de laisser la présence d'un simple attribut changer le sens d'un morceau de code C #. Considérons mon exemple d’énumération Foo . La suppression de l'attribut Flags doit-elle permettre de casser le code en modifiant en mode silencieux les valeurs de l'énumérateur?

Autres conseils

Oui, vous devez spécifier les valeurs dans Enum pour que les valeurs d'indicateur ajouté fonctionnent correctement (pour pouvoir combiner deux indicateurs enum sans que cette valeur ne soit en conflit avec un autre indicateur spécifié). Vous n'avez pas besoin de spécifier de valeurs pour le compiler, mais le résultat ne sera probablement pas celui que vous recherchez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top