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

Windows Forms Discussion :

[intellisens] Enum en C# et en VB


Sujet :

Windows Forms

  1. #1
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut Enum en C# et en VB
    Bonjour,

    J'ai un petit souci pour accéder à des enums dans l'IDE.

    Exemple de code VB :
    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
     
    class machin 
    {
        private enum entrucs
            valeur1
            valeur2
        end enum
     
        private _trucs as entrucs
     
        public readonly property Trucs as entrucs
            get { return _trucs }
     
        public sub New()
            _trucs = new entrucs
        end sub
    }
    En C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class machin 
    {
        private enum entrucs
        { valeur1,valeur2 }
     
        private entrucs _trucs
     
        public readonly entrucs Trucs
        {
            get { return _trucs }
        }
    }
    Ca marche en VB, pas en C#

    Qu'est-ce que je loupe ?

  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
    Ca veut dire quoi "ca marche pas en C#" ? Message d'erreur ?

    Sinon, petites remarques:
    dans ton code, Trucs est en readonly mais ce n'est pas nécessaire si tu n'implémentes pas le set dans la propriété De plus, _trucs est déclaré mais on ne lui affecte pas de valeur.....

  3. #3
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Oui, j'ai fait ça un peu vite avant d'aller manger.
    Le readonly ne doit même pas être valable en C#.

    Je corrige le pseudo code :

    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
    class machin 
    {
        private enum entrucs
        { valeur1,valeur2 }
     
        private entrucs _trucs;
     
        public entrucs Trucs
        {
            get { return _trucs }
        }
     
        machin()
        { _trucs = new entrucs(); }
     
    }
    J'ai rajouté un constructeur, mais en fait ce n'est pas vraiment là mon problème.
    C'est plutôt à l'édition du code. Lorsque je dis que ça marche ou pas, j'entendais "avec intellisens".
    Dans le code VB, je peux entrer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monObjet.Trucs.valeur1
    Valeur1 est proposée par intellisens. Pratique.
    Et c'est là qu'il y a différence avec C#, qui ne me propose pas ce choix dans l'énumération.

    Il s'agit d'un code que j'entre de mémoire, je mettrais le vrai code qui fonctionne en VB ce soir.

  4. #4
    Membre confirmé Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Par défaut
    Ta propriété est en ReadOnly (pas de set), donc tout ce que tu peux faire avec c'est des comparaisons, et ca se passe comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public enum EnTrucs
    {
        valeur1,
        valeur2
    }
    public class machin 
    {
        private EnTrucs _trucs
     
        public EnTrucs Trucs
        {
            get { return _trucs }
        }
    }
    et la comparaison:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(MonMachin.Trucs == EnTrucs.valeur1)
    {
        //Code
    }

  5. #5
    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
    Je pense comme Ingham: pour moi, il s'agit d'une fonctionnalité du l'IDE pour C#, qui permet de proposer des résultats uniquement au bon endroit....

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 104
    Par défaut
    Bonjour,

    J'ajouterai que l'énum est définie en "private" dans la classe (également privée par défaut) et que la propriété Trucs est public ... bref le "pseudo code", comme tu dis, en C# ne doit pas marcher.

    sinon le code de Ingham doit très bien marcher.

  7. #7
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 33
    Par défaut
    Je pense aussi que le code de Ingham devrait marcher car le enum est défini en public en dehors de la classe.
    Sinon, juste une petite remarque bête, il manque un ";" après return _trucs !

  8. #8
    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
    Citation Envoyé par cboun94
    J'ajouterai que l'énum est définie en "private" dans la classe (également privée par défaut)
    Bien vu, bonne remarque

  9. #9
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par Ingham
    Ta propriété est en ReadOnly (pas de set), donc tout ce que tu peux faire avec c'est des comparaisons
    Oui aussi.
    En fait, je veux l'utiliser pour accéder à l'index des colonnes d'une datatable de façon parlante (je préfère coder [colonnes.identifiant] plutot que [0]).
    Et j'aimerais deux choses, si c'est possible :

    que ma classe ressemble plutôt à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class DefTable
    {
        public enum EnColonnes {  identifiant, valeur }
        private EnTrucs _colonnes;
        public EnTrucs Colonnes
        {  get { return _colonnes; }  }
    }
    Et ensuite qu'intellisens fonctionne au niveau de l'auto complétion lorsque j'entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    objTable.Columns[(int)objDef.Colonnes.identifiant]
    un enum doit être casté en int à l'utilisation il me semble.

  10. #10
    Membre confirmé Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Par défaut
    Je comprends pas l'interet, tu veux acceder aux valeurs d'un enum, sans passer par cet enum mais par une variable l'utilisant ? Je trouve ca totalement illogique.

    Pour "caster en int" un enum, il faut faire comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [Flags]
    public enum Colones
    {
      valeur1 = 0,
      valeur2 = 1,
      valeur3 = 2
    }
    Et mets ca en dehors de ta classe.

    Accessoirement tu risque de te compliquer la vie en utilisant un enum au lieu des index... Supposons que ta table change pour un raison X, tu vas être obligé d'aller modifier ton enum en fonctions, prise de tête....

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 104
    Par défaut
    Citation Envoyé par Ingham
    Pour "caster en int" un enum, il faut faire comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [Flags]
    public enum Colones
    {
      valeur1 = 0,
      valeur2 = 1,
      valeur3 = 2
    }
    L'utilisation du FlagsAttibute n'est absolument pas obligatoire, et dans ce cas, ça ne sert à rien.
    Sans précision, l'enum est un int32, et des valeurs continues sont attribuée automatiquement. Cependant, attribuer des valeurs peut s'avérer plus pratique pour la maintenance. Donc si on retire [Flags], l'exemple de code est, je trouve, une bonne façon de faire.

    Citation Envoyé par jml94
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objTable.Columns[(int)objDef.Colonnes.identifiant]
    je pense que tu veux plutôt écrire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objTable.Columns[(int)objDef.EnColonnes.identifiant]
    Du coup, la propriété "Colonnes" ne sert à rien.

    Si cette classe sert à décrire une table, je ne trouve pas ça choquant d'avoir la définition de l'énum à l'intérieur de la dite classe.

  12. #12
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par Ingham
    Accessoirement tu risque de te compliquer la vie en utilisant un enum au lieu des index... Supposons que ta table change pour un raison X, tu vas être obligé d'aller modifier ton enum en fonctions, prise de tête....
    Justement non, bien au contraire.

    Si ma structure change, disons deux colonnes interchangées, il suffit de modifier l'enumération pour accéder au bon index. Si je devais coder les indexes en dur, c'est là que la galère arrive.

  13. #13
    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
    Citation Envoyé par jml94
    Justement non, bien au contraire.

    Si ma structure change, disons deux colonnes interchangées, il suffit de modifier l'enumération pour accéder au bon index. Si je devais coder les indexes en dur, c'est là que la galère arrive.
    +1
    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

  14. #14
    Membre confirmé Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Par défaut
    Hum c'est pas faux

    Ou alors, pourquoi pas utiliser des constantes ?
    Ca sera moins long a coder, et il y aura pas de conversion à faire.

  15. #15
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par Ingham
    Hum c'est pas faux

    Ou alors, pourquoi pas utiliser des constantes ?
    Ca sera moins long a coder, et il y aura pas de conversion à faire.
    Non plus. Le côté énumération de base zero est idéal pour représenter une structure de table.

    Avec les contantes, si j'ai une table de 25 champs, et que je supprime le 11, je dois me palucher les valeurs de plus de la moitié. Je suis trop fainéant pour ça.
    De plus, une énumération me donne accès à un parcours type "foreach" pour parcourir les indexes. Bon pour l'instant ça ne me sert à rien, mais peut-être plus tard...

  16. #16
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Comme je suis toujours empêtré là-dedans, je reformule ma question :

    comment retourner unj enum comme propriété d'instance, et non en tant que propriété de classe ?

    Hypthèse :

    j'ai cette enumération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public enum Colonnes { id, valeur }
    Comment l'utiliser pour pouvoir l'utiliser de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (int)myObjet.Colonnes.id
    Merci

Discussions similaires

  1. [MySQL] Récupérer les valeurs définies dans un champ ENUM
    Par Huntress dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 03/07/2010, 18h55
  2. [VB.NET] Variable de type enum avec du string
    Par Mouse dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/01/2005, 18h22
  3. [MySQL] Valeur par défaut d'un type ENUM
    Par aliasjcdenton dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/10/2004, 20h44
  4. enum??
    Par $grm$ dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 23/04/2004, 16h34
  5. [TABLE][ENUM] u champs à choix multiple ?
    Par narmataru dans le forum SQL
    Réponses: 2
    Dernier message: 04/11/2003, 10h25

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