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

VB.NET Discussion :

Problème d'enum et de type


Sujet :

VB.NET

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut Problème d'enum et de type
    Bonjour à tous,

    Voici une question qui, je pense, sera assez vite résolue mais sur laquelle je sèche...

    Dans une classe, j'ai créé l'énumération ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Public Enum e_langue As Integer
            nederlands = 1
            francais = 2
        End Enum
    Dans la même classe, j'ai la propriété suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Private _language As e_langue
        Public Property Language() As e_langue
            Get
                Return _language
            End Get
            Set(ByVal value As e_langue)
                _language = value
            End Set
        End Property
    Etant donné que l'enum est de type Integer, pourquoi ne puis-je pas affecter une valeur de type Integer à la propriété Language dans le constructeur de ma classe ?

    Visual Studio suggère de faire un cast avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CTYPE(maValeur,e_langue)
    mais je suis sceptique sur ce coup-là.

    Griftou.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 184
    Points : 4 497
    Points
    4 497
    Par défaut
    C'est un peu le but de l'enum ne pas envoyer un int mais un enum

    Un enum c'est un "typage d'int"

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    D'après la msdn, si j'ai bien compris, les énums ne sont que des regroupements de constantes qui traitent d'un même sujet.

    Dans mon cas, les langues.

    Mais bon, ça ne m'avance pas lol.

    Je crois que je vais virer l'énum. Je l'avais mise en me disant "ça va faire bien dans le code de tester si la propriété est égale à langue.français plutot que 2"

    Et en plus, ce serait plus lisible.

    Aussi, j'ai l'impression que faire un if sur la valeur de ma variable pour savoir quelle valeur d'enum affecter ferait perdre l'utilité de l'énum.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Parce que tous les integers ne sont pas des ennum !

    Accessoirement comme déjà dit:

    L'interet d'utiliser un ennum et de garantir que la valeur ferra effectivement partie de l'ensemble déterminé.

    En réalité dans ton code tu ne devrais pas écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monobjet.Language = CTYPE(2,e_langue)
    mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monobjet.Language = francais

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 184
    Points : 4 497
    Points
    4 497
    Par défaut
    Euh non les enums c'est super pratique


    Ton constructeur doit etre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MaClass(e_langue langue)
    {
    Language=langue;
    }
    ---------

    Et tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClass maClass= new MaClass(e_langue.francais);

  6. #6
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Ok pour le constructeur mais comme dans la db la valeur de langue est de type integer (smallint pour être précis), je devrais quand même faire qqch du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim langue, langueDB as Integer
    langueDB = FonctionQuiVaChercherLaLangueDansLaDB()
    If langueDB = 1 Then
       langue = e_langue.nederlands
    Else 
       langue = e_langue.francais
    End If
    Et ce sera la variable langue que je passe en paramètre de mon constructeur.

    Correct ?

  7. #7
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    En C# (et en VB j'imagine), on peut tout simplement caster un int en enum et réciproquement : "int x = (int)MyEnum.MyValue;"

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 184
    Points : 4 497
    Points
    4 497
    Par défaut
    Euh non la tu suis ce que VS t'a dit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try
    Dim e_num langueUtilisateur=CTYPE(FonctionQuiVaChercherLaLangueDansLaDB(),e_langue)
    catch
    {
    // langue inconnue
    }
    et puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim maClass = new MaClass(langueUtilisateur);

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 184
    Points : 4 497
    Points
    4 497
    Par défaut
    DonQuiche:
    Ici le but est de faire l'inverse je pense

    Mais quand il devrais sauver en BD

  10. #10
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Ok j'y suis. Merci beaucoup !

    J'ai cependant une question pour aller à l'étape suivante.

    Sans rentrer dans les détails du pourquoi, comment puis-je surcharger la fonction ToString de mon enum (je n'arrive plus à retrouver la bonne syntaxe) ?

    Griftou.

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    une enum n'est pas une classe et c'est juste fait pour le développeur, pas pour l'affichage, donc pas possible d'avoir un ToString dessus

    par contre rien ne t'empeche de faire une fonction quelque part qui demande un membre d'enum et retourne un string

    après si c'est pour mettre dans un control, il te faudrait surement une classe
    Langue avec les propriétés Id, Nom et une collection

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par sinople Voir le message
    L'interet d'utiliser un ennum et de garantir que la valeur ferra effectivement partie de l'ensemble déterminé.
    C'est faux, un enum ne donne absolument pas ce genre de garanties... tu peux très bien faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Enum MyEnum
    	Foo = 1
    	Bar = 2
    	Baz = 3
    End Enum
     
    Private Sub Main()
    	Dim x As MyEnum = CType(42, MyEnum)
    End Sub
    Ca n'a pas de sens, mais ça fonctionne...

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    surtout qu'une enum peut aussi être utilisée avec des masques binaires, faisant que la valeur peut etre non incluse et pourtant avoir une signification (Anchor.Left Or Anchor.Right par exemple qui signifie les 2)

  14. #14
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Citation Envoyé par tomlev Voir le message
    C'est faux, un enum ne donne absolument pas ce genre de garanties... tu peux très bien faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Enum MyEnum
    	Foo = 1
    	Bar = 2
    	Baz = 3
    End Enum
     
    Private Sub Main()
    	Dim x As MyEnum = CType(42, MyEnum)
    End Sub
    Ca n'a pas de sens, mais ça fonctionne...
    Ah merci pour l'info.

    Comme dirait l'autre: Je vais m'endormir moins con ce soir!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XHTML] Problème avec des balise de type block
    Par kei-kun41 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 05/06/2006, 13h55
  2. problème avec bloc détail de type tabulaire(forms)
    Par med_anis_dk dans le forum Forms
    Réponses: 3
    Dernier message: 01/06/2006, 21h16
  3. Problème avec control parent de type TDrawGrid
    Par slylafone dans le forum C++Builder
    Réponses: 2
    Dernier message: 09/11/2005, 17h32
  4. Réponses: 1
    Dernier message: 27/07/2005, 17h08
  5. Problème avec les champs de type table
    Par devdev dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/12/2004, 16h05

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