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 :

get et set en c#


Sujet :

C#

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 205
    Points : 206
    Points
    206
    Par défaut get et set en c#
    Voici un code que j'ai teste:

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private int login
            {
               public get
                {
                    return login;
                }
                public set
                {
                    login = value;
                }
            }
    Je pensais pouvoir accéder et setter la valeur login grace au get et au set en public, mais je me rends compte que non, et qu'il faut ecrire le code suivant:

    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private int _login;
     
    public int login
            {
               get
                {
                    return _login;
                }
                set
                {
                    _login = value;
                }
            }
    3) ou a partir de c# 3 semble-t-il:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public int login {get; set;}

    Voici ma question:

    Puisque le code 1) qui compile ne permet pas d'acceder au setteur ni au getteur qui sont pourtant public, que le code 2) déclare 2 fois plus de variables que nécessaire, et que le code 3 ne déclare rien en private (pas terrible pour le respect du principe d'encapsualtion), je commence a me demander s'il n'est pas plus simple de tout simplement faire comme cela:

    Comment utilisez vous les get et set en c# et comment le justifiez vous?

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par julien_iz Voir le message
    Puisque le code 1) qui compile ne permet pas d'acceder au setteur ni au getteur qui sont pourtant public
    Normal puisque la propriété est marquée comme privée.

    Citation Envoyé par julien_iz Voir le message
    que le code 2) déclare 2 fois plus de variables que nécessaire
    Le code 2 ne déclare qu'une seule variable (_login). La propriété n'est pas une déclaration de variable mais juste un moyen d'y accéder.

    Citation Envoyé par julien_iz Voir le message
    et que le code 3 ne déclare rien en private (pas terrible pour le respect du principe d'encapsulation)
    Si mais c'est le compilateur qui s'en charge. L'encapsulation est toujours préservée via la propriété.

    Bref, je pense que tu devrais revoir un peu la notion de propriété car tu sembles mélanger pas mal de choses. Une propriété c'est l'équivalent des méthodes GetMachin et SetMachin comme on fait en Java, sauf que les propriétés permettent d'avoir une écriture plus naturelle. Une fois compilé cela se traduit par des méthodes bien évidemment.
    Pas de questions techniques par MP

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 205
    Points : 206
    Points
    206
    Par défaut
    Ok, je pensais que les propriétés définissaient a la fois un attribut + getteur + setteur.
    Y'a-t-il vraiment des cas ou une propriété n'est pas associée a un attribut qui lui est unique? (si la propriété ne déclare pas d'attribut dans le même temps, c'est qu'il y a certainement une raison...mais laquelle?)

    Cependant, l'écriture suivante semble bien créer bien un attribut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public int login { get; set; }
    Ça crée un attribut seulement si on ne met pas de code dans le getteur ni dans le setteur?

    Normal puisque la propriété est marquée comme privée.
    Je me rends compte que les modificateurs de portée devant get et set sont obligatoirement plus restrictifs que la portée de la propriété.

  4. #4
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par julien_iz Voir le message
    Ok, je pensais que les propriétés définissaient a la fois un attribut + getteur + setteur.
    Et non.

    Citation Envoyé par julien_iz Voir le message
    Cependant, l'écriture suivante semble bien créer bien un attribut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public int login { get; set; }
    Ça crée un attribut seulement si on ne met pas de code dans le getteur ni dans le setteur ?
    Oui, c'est une nouveauté du compilateur C# 3.0. Cela peut laisser penser que les propriétés définissent un attribut mais ce n'est pas vrai, car au final le compilateur générera un attribut.
    Pas de questions techniques par MP

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 205
    Points : 206
    Points
    206
    Par défaut
    Merci pour les réponses

    Je trouve que c'est un peu laid tout ça....
    (ça aurait été plus simple que les propriétés "pondent" un attribut a chaque fois, pas seulement lorsqu'il n'y a pas de code dans le set ni dans le get)

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    public class Inutile {
     
       private Hashtable myTable;
     
       public int Count {
          get { return myTable == null ? 0 : myTable.Count; }
       }
     
    }
    Quel aurait été l'intérêt pour ce genre de code de créer "automatiquement" un attribut ?

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    (ça aurait été plus simple que les propriétés "pondent" un attribut a chaque fois, pas seulement lorsqu'il n'y a pas de code dans le set ni dans le get)
    Dans ce cas comment déterminer le nom du champ créé ?

    Donc soit l'utilisateur gère tout : champ + propriété.
    Soit il ne gère rien : champ + propriété auto-générés.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 205
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    [CODE]

    Quel aurait été l'intérêt pour ce genre de code de créer "automatiquement" un attribut ?
    J'aurais créé une méthode personnellement, mais en effet, voila un cas ou l'attribut est inutile

    Dans ce cas comment déterminer le nom du champ créé ?

    public int login { get {return 0;}; set; }
    public int login { get; set; }

    Le compilo pourrait pas se débrouiller dans les 2 cas? Y'a juste a mettre un décorateur sur le nom de la propriete pour donner les nom de l'attibut et basta

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public int login { get {return 0;}; set; }
    Aucun intérêt : tu définis un setter sur un champ auto-généré, tu n'en connais donc pas le nom donc tu ne peux plus récupérer les valeurs.
    Ca reviendrait à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public int login
    {
    	get
    	{
    		return 0;
    	}
    	set
    	{
    	}
    }
    Donc oui le compilo pourrait se débrouiller en générant le code au dessus, mais le problème est qu'il laisserait passer silencieusement une erreur de conception.

    Si setter n'a pas de sens alors il faut imposer le read-only :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public int login
    {
    	get
    	{
    		return 0;
    	}
    }
    Plus généralement les outils de développement, ici le langage, doivent reposer le moins possible sur des règles implicites parfois subtiles.
    Le code doit être le plus clair possible pour en faciliter la maintenance par des personnes pas forcément au fait de toutes les subtilités.
    Le gain en concision est négligeable par rapport à la perte de sémantique.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 205
    Points : 206
    Points
    206
    Par défaut
    On peut trouver ça trop implicite en effet.

    Merci a tous pour vos réponses, je mets en résolu

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

Discussions similaires

  1. Méthodes get et set
    Par jcaspar dans le forum Langage
    Réponses: 6
    Dernier message: 12/04/2014, 22h48
  2. probleme avec les fonction get et set
    Par Invité dans le forum Flex
    Réponses: 0
    Dernier message: 23/01/2008, 14h44
  3. Get et Set du texte dans un wxStaticText
    Par Amybond dans le forum wxWidgets
    Réponses: 2
    Dernier message: 15/10/2007, 22h30
  4. Réponses: 3
    Dernier message: 12/02/2007, 14h21
  5. Créer les get et set des classes
    Par cameleon2002 dans le forum JBuilder
    Réponses: 3
    Dernier message: 17/09/2003, 21h03

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