Partager via


Conception d'énumérations d'indicateurs

Mise à jour : novembre 2007

Les énumérations d'indicateurs sont utilisées pour masquer des champs de bits et effectuer des comparaisons de bits. Il s'agit de l'option de conception à utiliser lorsque plusieurs valeurs d'énumération peuvent être spécifiées en même temps. Par exemple, vous pouvez combiner chacune des valeurs d'énumération GenericUriParserOptions pour configurer un analyseur d'URI (Uniform Resource Identifier) générique.

Utilisez des puissances de deux pour les valeurs d'une énumération d'indicateurs afin qu'ils puissent être combinés librement à l'aide de l'opération de bits OR.

Remarque importante :

Si vous n'utilisez pas des puissances de deux ou des combinaisons de puissances de deux, les opérations de bits ne fonctionneront pas comme prévu.

Envisagez de fournir des valeurs d'énumération spéciales pour les combinaisons d'indicateurs les plus couramment utilisées.

La combinaison de valeurs d'énumération d'indicateurs exige des compétences de niveau intermédiaire dont les développeurs implémentant des scénarios classiques ne devraient pas avoir besoin. Par exemple, l'énumération FileShare contient la valeur ReadWrite pour spécifier qu'un fichier partagé peut être accessible en lecture et en écriture. Cela indique aux développeurs qu'ils peuvent ouvrir un fichier partagé afin de lire celui-ci ou d'y écrire sans exiger d'eux qu'ils sachent comment spécifier une combinaison de valeurs d'énumération en tant que valeur unique.

Évitez de créer des énumérations d'indicateurs lorsque certaines combinaisons de valeurs ne sont pas valides.

Ce problème indique généralement que la signification de l'énumération n'est pas suffisamment précise. Envisagez de diviser l'énumération en deux ou plusieurs énumérations, chacune possédant un ensemble plus précis de valeurs. Prenez l'exemple de l'énumération mal définie suivante.

<Flags()> _
Public Enum PurchaseTypes

    SalePrice
    RegularPrice
    Book
    CompactDisk

End Enum
[Flags]
public enum PurchaseTypes
{
    SalePrice,
    RegularPrice,
    Book,
    CompactDisk
}

Le concepteur souhaite utiliser cette énumération avec la méthode suivante.

Public Overloads Function FindPriceForItem(ByVal title As String, ByVal purchase As PurchaseTypes) As Single
    Return 0
End Function
public float FindPriceForItem(string title, PurchaseTypes purchase)

Lors de l'appel à cette méthode, le paramètre purchase spécifie exactement une des valeurs SalePrice ou RegularPrice et exactement une des valeurs Book ou CompactDisk. Les développeurs ne seraient pas en mesure de déterminer l'élément requis sans consulter la documentation ou tester la méthode. Une meilleure approche consiste à séparer les deux types d'informations, en les plaçant dans leur propre énumération, comme illustré dans l'exemple de code suivant.

Public Enum ItemType

    Book
    CompactDisk

End Enum

Public Enum PriceType

    SalePrice
    RegularPrice

End Enum
public enum ItemType
{
    Book,
    CompactDisk
}

public enum PriceType
{
    SalePrice,
    RegularPrice,
}

La signature de méthode est modifiée pour refléter le nouveau design, comme l'illustre l'exemple de code suivant.

Public Overloads Function FindPriceForItem(ByVal title As String, ByVal name As ItemType, ByVal price As PriceType) As Single
    Return 0
End Function
public float FindPriceForItem(string title, ItemType name, PriceType price)

Évite d'affecter zéro à une valeur d'énumération d'indicateurs, sauf si la valeur sert à indiquer que tous les indicateurs sont supprimés. Une telle valeur doit être nommée de façon appropriée, comme spécifié dans l'instruction suivante.

Notez que cette instruction concerne uniquement des énumérations d'indicateurs. Des énumérations simples peuvent, et doivent, utiliser la valeur zéro.

Attribuez le nom None à la valeur zéro des énumérations d'indicateurs. Dans le cas d'une énumération d'indicateurs, la valeur doit toujours signifier que tous les indicateurs sont supprimés.

Remarque importante :

N'utilisez pas la valeur zéro dans une énumération d'indicateurs pour indiquer un autre état car il n'existe aucun moyen de vérifier s'il s'agit d'un indicateur de valeur zéro explicitement défini ou si cela signifie qu'aucun indicateur n'a été défini.

Portions Copyright 2005 Microsoft Corporation. Tous droits réservés.

Portions Copyright Addison-Wesley Corporation. Tous droits réservés.

Pour plus d'informations sur les instructions de conception, consultez le livre « Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries » de Krzysztof Cwalina et Brad Abrams, publié par Addison-Wesley, 2005.

Voir aussi

Concepts

Conception d'énumérations

Ajout de valeurs à des énumérations

Autres ressources

Instructions de conception de types

Instructions de conception pour le développement de bibliothèques de classes