IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Suggestion pour les flags en C#


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Activité
    Inscrit en
    Juillet 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Activité

    Informations forums :
    Inscription : Juillet 2005
    Messages : 94
    Par défaut Suggestion pour les flags en C#
    Bonjour,

    Lorsqu'on veut manipuler des flags, nous avons deux choix:

    Utiliser une énumération avec l'attribut [Flags] ou utiliser une structure.

    Avantages d'une énumération [Flags]:
    - Permet les comparaisons binaires.
    Désavantages d'une énumération [Flags]:
    - Opérations binaires nécessaires pour modifier un bit.

    Avantages d'une structure:
    - Modification d'un bit facile.
    Désavantages d'une structure:
    - Pas d'opérateurs binaires pour comparer la structure en entier.

    On pourrait envisager d'ajouter l'opérateur [] à un nombre de sorte que l'on puisse accéder à ses bits directement. Ainsi, nous aurions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i = 1024;
    i[9] = false;
    Nous pourrions donc déclarer une énumération allant de 0 à 31 permettant de manipuler jusqu'à 31 flags.

    Toutefois, nous nous retrouvons à devoir utiliser une énumération et un entier conjointement.

    Cette proposition reste une idée, mais inefficace pour les flags.

    La deuxième solution consisterait en une combinaison des forces de toutes ces idées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public flags ErrorFlags{
        MessageCorrupted,
        SocketError,
        UnknownError,
    }
    C'est une déclaration semblable à une énumération. Toutefois, voici ce que flags nous permettrait:
    -Comparaisons binaires de l'ensemble complet.
    -Accès à un bit particulier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void myFunc(){
        //Initialisation comme une énumération avec l'attribut [Flags]
        ErrorFlags myflags = ErrorFlags.MessageCorrupted | ErrorFlags.SocketError;
        //Comparaisons binaires de l'ensemble
        if(myflags == (ErrorFlags.MessageCorrupted & ErrorFlags.UnknownError)){
            //Accès à un bit particulier.
            myflags.UnknownError = false;
        }
     
    }
    Simple, élégant, que pensez-vous de cela?

    -Ajouter l'opérateur [] sur les int. (pas pour les flags mais pourraît être utile)
    -Créer l'équivalent de mon 'flags' dans l'exemple, qui ressemble à un enum ave c l'accès aux bits particuliers.

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Ben, c'est quoi la question


    Pis, dans ce que tu as écrit, pourquoi ne pas passer par une simple énumération ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Activité
    Inscrit en
    Juillet 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Activité

    Informations forums :
    Inscription : Juillet 2005
    Messages : 94
    Par défaut
    L'énumération ne permet pas simplement de mettre un bit à off ou on, il faut avoir recours aux opérations binaires.

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    [Flags]
    public enum Errors{
        SocketError = 1,
        CorruptedMessage = 2,
        UnknownError = 4,
    }
     
    private void Exemple(){
        Errors myErrors = Errors.SocketError & Errors.UnknownError;
        //Mettre un bit à on.
        myErrors |= Errors.CorruptedMessage;
        //Inverser un bit.
        myErrors ^= Errors.CorruptedMessage;
        //Mettre un bit à off.
        myErrors &= !Errors.CorruptedMEssage;
    }
    Le processeur doit effectuer plusieurs opérations simplement pour modifier un bit. Il serait plus simple de l'accéder directement pour lui affecter sa valeur. Moins d'opérations seraient en jeu et le code tournerait plus vite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public flags Errors{
        SocketError,
        CorruptedMessage,
        UnknownError,
    }
     
    private void Exemple(){
        Errors myErrors = Errors.SocketError & Errors.UnknownError;
        //Mettre un bit à on.
        myErrors |= Errors.CorruptedMessage;
        myErrors.CorruptedMessage = true;
        //Inverser un bit.
        myErrors ^= Errors.CorruptedMessage;
        myErrors.CorruptedMessage = !myErrors.CorruptedMessage;
        //Mettre un bit à off.
        myErrors &= !Errors.CorruptedMessage;
        myErrors.CorruptedMessage = false;
    }
    En passant, ce n'est pas une question, ce sont juste deux idées que j'ai eues et dont je souhaite discuter.

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Oui mais quel est l'intérêt ? Le langage est écrit comme ça, soit tu l'acceptes, soit tu utilises un autre langage.
    Je ne comprends pas ce que tu attends...
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  5. #5
    Membre confirmé
    Homme Profil pro
    Activité
    Inscrit en
    Juillet 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Activité

    Informations forums :
    Inscription : Juillet 2005
    Messages : 94
    Par défaut
    Je n'attends rien. Je ne compte pas modifier c# lol, mais peut-être envoyer la suggestion à Microsoft si après discussion, il s'avère que ça semble utile à plus d'une personne. Alors la question, c'est 'Comment trouvez-vous cette idée?' ou comme je l'ai dit vers la fin de mon premier message, 'Qu'en pensez-vous?'.

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    J'aime les enums comme elles sont
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

Discussions similaires

  1. Suggestion : Un favicon pour les forums dvp.net
    Par prgasp77 dans le forum Evolutions du club
    Réponses: 5
    Dernier message: 06/04/2005, 22h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo