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 :

Enum en entiers


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Enum en entiers
    Hello,

    Je voudrais qu'une valeur ne puisse prendre que les valeurs 1, 2, ou 3.

    Les enums ont besoin d'identifiants pour chaque valeurs.

    Or, je n'ai pas besoin d'identifiants. Je veux seulement qu'un entier puisse recevoir un certain nombre de valeurs. Comment faire ?

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par oodini Voir le message
    Or, je n'ai pas besoin d'identifiants. Je veux seulement qu'un entier puisse recevoir un certain nombre de valeurs. Comment faire ?
    Utiliser un enum : qui peut le plus peut le moins.

    Sur les persistences SGBD, il existe un moyen de contraindre des plages de valeurs sur un type, mais pas dans les langages de programmation en général.(il y a surement des exceptions).

    On peut décrire te demande autrement :
    un int est par définition une structure qui peut prendre toutes les valeurs entre (-2^31) + 1 et (2^31) - 1.
    Donc si tu veux quelque chose qui prend les valeurs 1,2,3 ce n'est pas un entier dont tu as besoin, mais "quelque chose" pouvant prendre les valeurs 1,2,3; c'est précisément l'usage de l'enum.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Donc si tu veux quelque chose qui prend les valeurs 1,2,3 ce n'est pas un entier dont tu as besoin, mais "quelque chose" pouvant prendre les valeurs 1,2,3; c'est précisément l'usage de l'enum.
    Certes, mais comment l'implémenter ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    enum pouet { _1=1, _2, _3 }
    pouet = 2;
    ?

  4. #4
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Citation Envoyé par oodini Voir le message
    Certes, mais comment l'implémenter ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    enum pouet { _1=1, _2, _3 }
    pouet = 2;
    ?
    plutot comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    enum pouet{ un = 1, deux, trois }
     
    pouet a = pouet.un;
    pouet b = (pouet)2;

  5. #5
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    L'enum est le plus approprié, après tu peux toujours monter un système d'exception mais bon c'est juste pour s'arracher un peu les cheveux de la tête que je te donne un exemple


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    enum Entier {One=1,Two };
     
    int i = (int)Entier.One;

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    class X
    		{
     
    			List<int> ValeursValides = new  List<int>() { 1,2,3 };
    			int _MonEntier;
    			public int MonEntier
    			{
    				get {return _MonEntier;}
    				set
    				{
    					bool valide = Convert.ToBoolean(
    										(from valeursvalides in ValeursValides
    					               where valeursvalides == value
    					               select valeursvalides).Count()
    					);
     
    					if (!valide)
    					{
    						throw new Exception("valeur " + value + " invalide");
    					}
    					else
    					{
    						_MonEntier = value;		
     
    					}
     
     
    				}
    			}
    		}

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par hegros Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    enum Entier {One=1,Two };
     
    int i = (int)Entier.One;
    OK. C'est ce à quoi j'avais pensé, mais je voulais savoir s'il y avait moyen d'éviter ces identifiants factices.

    Merci.

  7. #7
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par oodini Voir le message
    OK. C'est ce à quoi j'avais pensé, mais je voulais savoir s'il y avait moyen d'éviter ces identifiants factices.

    Merci.
    Beh non c'est la valeur associée à un élément de ton enum. Sinon comment savoir que la valeur de l'int 'One' commence à 0 ou 1 ou autre chose ?

    Edit : quoi que si la valeur du premier est 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum Entier { Zero, Un, Deux, Trois };

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par hegros Voir le message
    L'enum est le plus approprié, après tu peux toujours monter un système d'exception mais bon c'est juste pour s'arracher un peu les cheveux de la tête que je te donne un exemple
    Dans ce cas on peut faire beaucoup plus joli et général. (avec la "magie" du mot clef "implicit" ).

    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
    18
    19
    20
    21
    22
    23
        class ConstraintInt
        {
            private static int _min =  1;
            private static int _max =  3;
            private int _value;
            private ConstraintInt(int value)
            {
                _value = value;
            }
            public static implicit operator ConstraintInt(int i)
            {
                if (i < _min || i > _max)
                {
                    throw new Exception("Pas dans la plage attendu");
                }
                return new ConstraintInt(i);
            }
     
            public static implicit operator int(ConstraintInt c)
            {
                return c._value;
            }
        }
    Puis tu exploites ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            public static void Test()
            {
                ConstraintInt c1 = 1; // OK
                ConstraintInt c2 = c1 + 1; // OK
                ConstraintInt c3 = 10; // Exception !
            }
    PLus sympa, non ?

    On peut même faire un truc de base ConstraintInt et une classe héritée qui via un attribut custom préciserait la plage attendue.

  9. #9
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par Bluedeep Voir le message

    PLus sympa, non ?
    Carrément plus sympa même


    Citation Envoyé par Aeronia
    hegros dans ton exemple, ca serait peut être mieux de faire ainsi :
    Carrément même

    J'avais bien préciser pour s'arracher les cheveux pas pour faire élégant ou simple

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

Discussions similaires

  1. [8086] Affichage d'un entier de 32 bits
    Par elNINIo dans le forum Assembleur
    Réponses: 12
    Dernier message: 10/05/2003, 20h33
  2. FormatFloat pour les entiers !?
    Par Lung dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2003, 15h20
  3. format entier
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 20/03/2003, 09h18
  4. Réponses: 9
    Dernier message: 17/01/2003, 11h45
  5. Réponses: 4
    Dernier message: 05/06/2002, 12h15

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