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 :

Un type se comportant (presque) comme un string à taille fixe


Sujet :

C#

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 167
    Par défaut Un type se comportant (presque) comme un string à taille fixe
    Bonjour,
    Voici de quoi mettre le cerveau en ébullition (le mien est déjà évaporé dans la ventilation ).
    J'ai besoin de manipuler plusieurs types qui représentent chacun une valeur de type string ayant une taille et un format fixe (3 chiffres, 2 lettres, avec ou sans espaces, etc...).
    Code exemple:
    Code c# : 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    	public struct CodeNumerique3 : ICodeValeur
    	{
    		#region Attributs
    		private string m_valeur;
     
    		#endregion
     
    		#region Propriétés
    		public string ValeurCode
    		{
    			get { return m_valeur; }
    		}
     
    		#endregion
     
    		#region Constructeurs
    		public CodeNumerique3(string code)
    		{
    			//----- Validation des paramètres -----
    			if (code == null) throw new ArgumentNullException("code");
    			//if (code.Length != 3) throw new ArgumentOutOfRangeException("code", code, "Le code doit être composé de 3 chiffres uniquement.");
    			if (!System.Text.RegularExpressions.Regex.IsMatch(code, @"\A\d{3}\z", System.Text.RegularExpressions.RegexOptions.Compiled)) throw new ArgumentOutOfRangeException("code", code, "Le code doit être composé de 3 chiffres uniquement.");
    			//-----
    			m_valeur = code;
    		}
     
    		#endregion
     
    		#region Méthodes
    		public override string ToString()
    		{
    			return m_valeur;
    		}
     
    		static public bool operator ==(CodeNumerique3 code1, CodeNumerique3 code2)
    		{
    			return (code1.m_valeur == code2.m_valeur);
    		}
    		static public bool operator !=(CodeNumerique3 code1, CodeNumerique3 code2)
    		{
    			return (code1.m_valeur != code2.m_valeur);
    		}
    		static public implicit operator CodeNumerique3(string code)
    		{
    			return new CodeNumerique3(code);
    		}
    		static public implicit operator string(CodeNumerique3 code)
    		{
    			return code.m_valeur;
    		}
     
    		#endregion
    	}
    On imagine sur le même modèle les types Alpha2, Alpha3 où la seule différence se situe sur les taille et format autorisés de la valeur interne.
    Le but de ces types est de garantir la validité d'une donnée au cours de son usage (en gros qu'il n'y en ai pas qui fasse n'importe quoi en manipulant des champs string bien définis et qui s'étonne après que les données soient pourries).
    J'ai opté pour l'instant pour un type structure mais rien ne s'oppose à la transformation en classe, du moment que ça correspond aux fonctionnalités recherchées.

    Se trouvent les problèmes suivants :
    1. L'usage d'une structure permet de garantir que le type se comporte en tant que valeur, mais se pose le problème de la valeur par défaut qui ne répond pas à la contrainte sur la valeur (parce que le constructeur concerné est non surchargeable).
    2. En passant par une classe pour contourner le problème 1 cela fait apparaitre le problème de passage par référence et non par valeur lors d'une affectation/copie. L'usage explicite d'une méthode de type Clone() est inenvisageable compte-tenu des futurs utilisateurs, trop débutants (et laxistes !) pour supporter la bonne gestion de la différence valeur/référence dans le contexte.
    3. Avec une structure il y a beaucoup de "copier/coller" de code (manque d'héritage) entre les différents types qui ne changent que sur la contrainte de valeur. Mais ça encore c'est moindre par rapport au reste.

    Quelqu'un a-t-il une idée pour corriger/contourner ces problèmes ?
    Ou un autre point de vue à me suggérer sur ce sujet ?

  2. #2
    Membre actif Avatar de dotEden
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 66
    Par défaut
    Citation Envoyé par Franckintosh Voir le message
    [*]En passant par une classe pour contourner le problème 1 cela fait apparaitre le problème de passage par référence et non par valeur lors d'une affectation/copie. L'usage explicite d'une méthode de type Clone() est inenvisageable compte-tenu des futurs utilisateurs, trop débutants (et laxistes !) pour supporter la bonne gestion de la différence valeur/référence dans le contexte.
    Bonsoir,

    Alors là je ne comprend vraiment pas le problème si tu créais une propriété get je ne vois pas en quoi tu fais un passage par référence .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MonObjet o1 = new Objet();
    MonObjet o2 = o1; //passage par référence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string s;
    ObjetString os = new ObjetString();
    s = os.maProprieteString; //passage par valeur
    Et l'utilisation de .clone() est encore moins compréhensible .
    Je pense ne pas du tout avoir compris ton problème en somme.

    Cordialement

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 167
    Par défaut
    Citation Envoyé par dotEden Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MonObjet o1 = new Objet();
    MonObjet o2 = o1; //passage par référence
    Je faisais justement référence (sans mauvais jeu de mot ) à ce cas là, si je récupère mon ObjetString depuis une source pour le copier dans une autre variable du même type.
    Le problème n'est pas de récupérer la valeur string, le problème est l'affectation d'un ObjetString dans un autre ObjetString sans copier les références (opérateur = non surchargeable).

  4. #4
    Membre actif Avatar de dotEden
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 66
    Par défaut
    Bonjour,

    Dans ton cas, conserve donc l'utilisation de ta structure et tu lui mets un constructeur dans ce cas, l'affectation se fera alors par valeur.

    Cordialement

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 167
    Par défaut
    Oui, mais alors juste avec ça se pose le problème n°1...

  6. #6
    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
    Je ne comprends pas les problèmes que tu rencontres avec l'usage d'une classe. (d'ailleurs une string est une classe ...)

    Par ailleurs, il n'y a pas vraiment de relation entre un type référence et un type valeur d'une part et entre le passage par référence ou par valeur.

    Ce sont deux notions assez disjointes.

    Bref, je ne vois rien dans ta description qui pose problème.

    Et pour l'affectation des valeurs, pourquoi ne fais tu pas une surcharge de l'opérateur d'affectation ?

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       public static implicit operator CodeNumerique3(string val)
            {
                return new CodeNumerique3(val);
            }

  7. #7
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Juste une petite suggestion (qui n'a rien à voir avec le schmilblick) : au lieu de faire 36 types, pourquoi ne pas en faire un seul, qui soit générique, et qui prenne le pattern en paramètre du constructeur.

    Avec ensuite levée d'exception dès que la valeur n'est pas conforme au pattern.

  8. #8
    Membre actif Avatar de dotEden
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 66
    Par défaut
    Bonjour,

    Pour précision Bluedeep, en C#, string n'est pas une classe mais bien un type primitif (contrairement au JAVA). De plus en regardant bien ton code, tu pourrais voir que Franckintosh a déjà ta méthode dans sa structure.
    Sinon, je ne comprend vraiment pas le problème, vu que tu n'as qu'un seul attribut de récupérer la valeur par une méthode genre getValue().

    Cordialement

  9. #9
    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
    Bonjour,

    Citation Envoyé par dotEden Voir le message
    Pour précision Bluedeep, en C#, string n'est pas une classe mais bien un type primitif (contrairement au JAVA).
    Non.
    String est une classe, immutable et non héritable (sealed), mais c'est une classe. Quelle soit prédéfini dans le compilo sous la forme du mot clef String ne change rien.

    Sa défintion est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       [Serializable]
        [ComVisible(true)]
        public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>
        {

  10. #10
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 167
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Juste une petite suggestion (qui n'a rien à voir avec le schmilblick) : au lieu de faire 36 types, pourquoi ne pas en faire un seul, qui soit générique, et qui prenne le pattern en paramètre du constructeur.

    Avec ensuite levée d'exception dès que la valeur n'est pas conforme au pattern.
    Parce que le but est, par exemple, d'avoir des classes qui contiennent toujours des CodeNumérique3 (donc sur 3 chiffres) et pas des CodeX dans lequel il pourrait y avoir n'importe quel format différent en fonction de l'instance.

    ----------
    Citation Envoyé par dotEden Voir le message
    Sinon, je ne comprend vraiment pas le problème, vu que tu n'as qu'un seul attribut de récupérer la valeur par une méthode genre getValue().
    Exemple concret du problème 1 :
    CodeNumerique3 l_code = new CodeNumerique3(); Comme c'est une structure, si quelqu'un utilise ça et le transmet à d'autres variables au final ça donne des valeurs invalides qui peuvent finir dans une BD.

    ----------
    Citation Envoyé par Bluedeep Voir le message
    Par ailleurs, il n'y a pas vraiment de relation entre un type référence et un type valeur d'une part et entre le passage par référence ou par valeur.
    Si tu connais une solution pour faire que monObjetDeClasse = monObjetDeMemeClasse; fasse une copie de la valeur au lieu de la référence je suis preneur.

    Citation Envoyé par Bluedeep Voir le message
    Et pour l'affectation des valeurs, pourquoi ne fais tu pas une surcharge de l'opérateur d'affectation ?

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       public static implicit operator CodeNumerique3(string val)
            {
                return new CodeNumerique3(val);
            }
    Ce n'est pas l'opérateur d'affectation, c'est l'opérateur de cast depuis un string qui permet CodeNumerique3 obj = "888".
    L'opérateur d'affectation = n'est pas surchargeable.

    ----------

    Merci pour vos questions, même si ça n'apporte pas d'avancée concrète pour l'instant ça me permet d'investiguer différent point de vue sur le problème.

  11. #11
    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 Franckintosh Voir le message
    ----------
    Si tu connais une solution pour faire que monObjetDeClasse = monObjetDeMemeClasse; fasse une copie de la valeur au lieu de la référence je suis preneur.
    Il n'y a pas; mais une fois encore, je ne comprends pas ton besoin.
    Quel interêt de transformer l'affectation en opérateur de copie ?

    Si c'est pour protéger les données, rend tes données internes immutables.

  12. #12
    Membre actif Avatar de dotEden
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 66
    Par défaut
    string est bien un type primitif, regarde la coloration du mot string pour t'en assurer.
    Mais il y a en effet une classe String comme il y a une classe Int32, Boolean, etc... (d'ailleurs sinon Microsoft aurait commit un crime de la nommer sans majuscule au début lui qui pousse les gens à suivre sa règle de nommage)
    D'ailleurs je me souviens avoir lu un article de Microsoft ventant les mérites de cette structure (je pense pour se comparer à Java ).

    Cordialement

  13. #13
    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 dotEden Voir le message
    string est bien un type primitif, regarde la coloration du mot string pour t'en assurer.
    Tu confonds avec les alias du compilateur (string est strictement équivalent à
    String).

    Ensuite, tu fais une confusion avec Java : contrairement à ce dernier, C# n'utilise pas de type d'encapsulation pour les types intrinsèques (int, long, etc .... qui sont représentés par des structs, ne sont pas complétés, contrairement à Java, par des types encapsulés - en C# Int32 est un strict alias de int).

  14. #14
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Citation Envoyé par dotEden Voir le message
    string est bien un type primitif, regarde la coloration du mot string pour t'en assurer.
    Mais il y a en effet une classe String comme il y a une classe Int32, Boolean, etc... (d'ailleurs sinon Microsoft aurait commit un crime de la nommer sans majuscule au début lui qui pousse les gens à suivre sa règle de nommage)
    D'ailleurs je me souviens avoir lu un article de Microsoft ventant les mérites de cette structure (je pense pour se comparer à Java ).

    Cordialement
    C'est Bluedeep qui dit vrai. Mais comme tu sembles assez têtu , voici un extrait des spécifications du langage C# (que, je l'espère, tu ne remettras pas en cause...) :
    Citation Envoyé par MSDN
    4.2.4 The string type

    The string type is a sealed class type that inherits directly from object. Instances of the string class represent Unicode character strings.

    Values of the string type can be written as string literals (§2.4.4.5).

    The keyword string is simply an alias for the predefined class System.String.
    Et tant qu'on y est :
    Citation Envoyé par MSDN
    4.1.4 Simple types

    C# provides a set of predefined struct types called the simple types. The simple types are identified through reserved words, but these reserved words are simply aliases for predefined struct types in the System namespace, as described in the table below.

    ...
    int / System.Int32
    ...

  15. #15
    Membre actif Avatar de dotEden
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 66
    Par défaut
    Citation Envoyé par _Max_ Voir le message
    C'est Bluedeep qui dit vrai. Mais comme tu sembles assez têtu , voici un extrait des spécifications du langage C# (que, je l'espère, tu ne remettras pas en cause...) :

    Et tant qu'on y est :
    Si j'étais têtu comme tu le dis, je pense que j'aurais insisté, et comme tu sembles être assez peu courtois, je te dirais qu'après la réponse de Bluedeep qui m'a déjà demandé de faire la même démarche que toi, à savoir aller chercher la réponse sur le Net, tu pourras donc en déduire que ton commentaire était tout à fait inutile.
    La prochaine fois, je te prie d'éviter de juger le caractère de quelqu'un que tu ne connais pas.

    Cordialement

  16. #16
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 167
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Si c'est pour protéger les données, rend tes données internes immutables.
    Merci pour cette lumière, j'étais trop focalisé sur le type du passage alors qu'en fait le plus important n'est pas si c'est la valeur ou le pointeur qui est copié mais que si on veut une nouvelle valeur il faut un nouvel objet.
    Donc au final j'ai transformé en classe, peu importe si lors d'une copie ça pointe sur le même objet, ce qui est important est que si on veut une autre valeur alors on change l'objet au lieu du contenu.

    Pour les curieux et ceux qui auraient la même idée tordue que moi voici le code qui fonctionne plutôt bien :
    Code C# : 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    	public sealed class CodeNumerique3 : CodeString
    	{
    		public CodeNumerique3(string code)
    			: base(code, 3, EConditionRegex.Numerique)
    		{
    		}
     
    		static public implicit operator CodeNumerique3(string valeur)
    		{
    			return new CodeNumerique3(valeur);
    		}
    	}
     
    	public abstract class CodeString : ICodeValeur
    	{
    		#region Interne Enum
    		protected enum EConditionRegex : byte
    		{
    			Aucune = 0,
    			Alpha,
    			Numerique,
    			Alphanumerique
    		}
     
    		#endregion
     
    		#region Attributs
    		private readonly string m_valeur;
    		private readonly EConditionRegex m_filtreRegex;
    		private readonly int m_longueur;
     
    		#endregion
     
    		#region Propriétés
    		public string ValeurCode
    		{
    			get { return m_valeur; }
    		}
     
    		#endregion
     
    		#region Constructeurs
    		protected CodeString(string valeur, int longueur, EConditionRegex filtre)
    		{
    			//----- Validation des paramètres -----
    			if (valeur == null) throw new ArgumentNullException("code");
    			//-----
    			m_longueur = longueur;
    			m_valeur = valeur;
    			m_filtreRegex = filtre;
    			if (!EvaluerSurLaContrainte(valeur)) throw new ArgumentOutOfRangeException("valeur", valeur, "La valeur ne satisfait pas la contrainte de format.");
    		}
     
    		#endregion
     
    		#region Méthodes
    		/// <summary>
    		/// Evalue si la valeur est valide par rapport à la contrainte de format.
    		/// </summary>
    		/// <param name="valeur">La valeur à valider.</param>
    		/// <returns>Le résultat de l'évaluation. VRAI si la valeur satisfait la contrainte, FAUX sinon.</returns>
    		protected virtual bool EvaluerSurLaContrainte(string valeur)
    		{
    #if DEBUG
    			string l_patron = GenererPatronRegex();
    			return System.Text.RegularExpressions.Regex.IsMatch(valeur, l_patron, System.Text.RegularExpressions.RegexOptions.Compiled);
    #else
    			return System.Text.RegularExpressions.Regex.IsMatch(valeur, GenererPatronRegex(), System.Text.RegularExpressions.RegexOptions.Compiled);
    #endif
    		}
     
    		protected virtual string GenererPatronRegex()
    		{
    			StringBuilder l_patron = new StringBuilder();
    			bool l_longueurFixe = (m_longueur > 0);
    			const string FORMAT_PATRON = @"\A{0}{1}\z";
    			string l_classe;
    			string l_quantite;
     
    			if (l_longueurFixe) l_quantite = string.Concat(@"{", m_longueur, @"}");
    			else l_quantite = @"*";
     
    			switch (m_filtreRegex)
    			{
    				case EConditionRegex.Alpha:
    					l_classe = @"[^\W\d]";
    					break;
    				case EConditionRegex.Numerique:
    					l_classe = @"\d";
    					break;
    				case EConditionRegex.Alphanumerique:
    					l_classe = @"\W]";
    					break;
    				case EConditionRegex.Aucune:
    				default:
    					l_classe = @".";
    					break;
     
    			}
    			l_patron.AppendFormat(FORMAT_PATRON, l_classe, l_quantite);
    			return l_patron.ToString();
    		}
     
    		public override string ToString()
    		{
    			return m_valeur;
    		}
    		public override int GetHashCode()
    		{
    			return m_valeur.GetHashCode();
    		}
    		public override bool Equals(object obj)
    		{
    			if (obj == null || GetType() != obj.GetType()) return false;
    			CodeString l_code = (CodeString)obj;
    			return (m_valeur == l_code.m_valeur);
    		}
     
    		#endregion
     
    		#region Opérateurs
    		static public bool operator ==(CodeString code1, CodeString code2)
    		{
    			return (code1.m_valeur == code2.m_valeur);
    		}
    		static public bool operator !=(CodeString code1, CodeString code2)
    		{
    			return (code1.m_valeur != code2.m_valeur);
    		}
    		static public implicit operator string(CodeString code)
    		{
    			return code.m_valeur;
    		}
    		//A Implémenter dans les classes descendantes :
    		//static public implicit operator CodeString(string valeur)
    		//{
    		//    return new CodeString(valeur);
    		//}
     
    		#endregion
    	}
    Exemples d'usage :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CodeNumerique3 monCode3 = "888";
    string monString = monCode3;
     
    void maFonctionCode3(CodeNumerique3 arg){}
    -> maFonctionCode3("777");
    -> maFonctionCode3("7777"); //lève une exception
    -> maFonctionCode3("xxx"); //lève une exception

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/08/2010, 16h01
  2. Réponses: 1
    Dernier message: 02/12/2008, 10h29
  3. Spécifier le type d'une arrayList comme en Java
    Par As2piK dans le forum ASP.NET
    Réponses: 2
    Dernier message: 27/03/2007, 20h49
  4. String à taille fixe
    Par tidar dans le forum Langage
    Réponses: 10
    Dernier message: 30/01/2007, 22h49
  5. est ce que existe type struct en java comme en c ?
    Par bill7 dans le forum Langage
    Réponses: 10
    Dernier message: 11/01/2006, 10h02

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