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; set;} ou pas !?


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut {get; set;} ou pas !?
    Salut a tous !

    J'aimerais comprendre a quoi sert reelement les ascesseurs get et set ? Car mettre une variable en public revient a faire la même chose, je m'explique :

    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
     
    public class Voiture
    {
        public int Vitesse { get; set; }
     
        public Voiture()
        {
               Vitesse = 5;
        }
     
        public void Rouler()
        {
              MessageBox.Show("Vitesse : " + Vitesse)
        }
    }

    Et j'appelle comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Form load...
    {
          Voiture test = new Voiture();
          test.Rouler();
     
          test.Vitesse = 50;
          test.Rouler();
     
    }
    Voila donc avec ou sans le get est ca fait exactement la même chose...

    On m'explique ? ^^


    Merci !

  2. #2
    Membre éprouvé Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Points : 1 236
    Points
    1 236
    Par défaut
    Bonjour,

    En fait si le résultat est le même (tu accède a la propriété), c'est pas exactement ça. Passer par des accesseurs, c'est acceder à la propriété mais dans tous les cas en passant par une méthode intermédiaire. Le résultat est sensiblement le même si tu ne fait rien d'autre que les GET et SET de base, mais si tu rajoutes du code par exemple dans un GET, c'est du code qui sera appelé a chaque fois que tu voudras accéder a la propriété.

    Tu peux alors faire des tests sur l'utilisateur pour gérer des permissions par exemple, etc.

    Bon en général, on fait surtout des accesseurs pour la bonne pratique, car si on a des propriétés en public et d'autres en privés qui ont des accesseurs (qui ont vraiment un rôle à jouer), c'est plus facile de s'y retrouver. Pour plus d'informations

    Bonne journée
    La Triforce du développement : Fainéantise, Curiosité et Imagination.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 766
    Points
    766
    Par défaut
    Si je ne m'abuse, si tu utilises la Reflection il faut les get/set sinon tu ne verra pas les properties. Comme un binding qui ne fonctionne pas...
    Les fautes d'orthographes sus-citées sont déposées auprès de leurs propriétaires respectifs. Aucune responsabilité n'est engagée sur la lisibilité du message ou les éventuels dommages qu'il peut engendrer.

  4. #4
    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 485
    Points
    5 485
    Par défaut
    C'est exactement la même chose sauf que l'ajout d'une propriété permet par exemple :
    * De correspondre à une propriété d'interface (limite de dotnet).
    * De correspondre à un champ XML pour XMLSerializer (limite du Serializer).
    * D'être utilisable pour la liaison de données (binding) sous XAML (limite de WPF/Xaml).
    * Etc.

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    une variable stocke une valeur, pas une propriété
    quand on écrit une propriété avec juste get et set, une variable privée sera implicitement ajoutée au moment de la compilation

    et une propriété permet d'apporter une multitude de fonctionnements qu'il est impossible de faire avec une variable, certains ont déjà été cités, il y aussi :
    - faire une sauvegarde dans le set ; le set signifie que la valeur change, au peut au passage lancer une sauvegarde en base ou autre
    - lever un event ; permet d'avertir le reste de l'appli que la valeur a changé
    - faire une vérification sur la valeur ; par exemple si tu as une propriété qui reflète une saisie et que tu veux un nombre entre 0 et 100 tu peux alors tester dans le set si c'est le cas, sinon tu throw une exception sans changer la valeur stockée
    - faire une initialisation tardive dans le get ; parfois quand on créer des tas d'instances, créer toutes les variables prend du temps et peut etre inutile, dans ce cas dans le get on vérifie que la variable est créée, si elle ne l'est pas on l'instancie
    etc...

    et il y a aussi les conventions, généralement une variable publique on se l'interdit, et on laisse ca aux propriétés
    ca permet de différencier les variables et paramétrages local à la classe des choses qui sont des paramètres publiques
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut
    Tout d'abord merci a vous tous pour vos réponses clair et précises !

    Volontairement je ne vais pas mettre Résolu au cas ou quelqu'un voudrait rajouter quelque chose !



    Ha si par contre jai une petite question, étant donner la convention, comme dois je déclarer un ascesseur ?
    Un prof d'info m'a dit que déclarer comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public string maVar { get; set; }
    Ne respectait pas la convention parce que justement c'est en public...

    Donc sa façon a lui est de le mettre en private et de faire les deux fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private string maVar;
    public string FonctionGet{......}
    public string FonctionSet{......}
    Pour moi, ayant chercher un peu sur le net, j'ai compris que déclarer de façon direct (comme dans mon premier exemple) était une façon de faire un getset standard, donc on affecte et on recupere simplement.
    Et ensuite si on voulait ajouter (par exemple), ou faire des choses intermédiaire, dans une valeur dans ma propriété, et bien il fallait que je le fasse en entier (donc en déclarant les fonctions).

    Je me suis peut être mal exprimé...

    Mais si vous n'en voyez aucun inconvénient, je veux bien savoir qu'elle est la différence entre ces deux déclarations !

    Merci encore !

  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 485
    Points
    5 485
    Par défaut
    Citation Envoyé par Naografix Voir le message
    Ha si par contre jai une petite question, étant donner la convention, comme dois je déclarer un ascesseur ?
    Un prof d'info m'a dit que déclarer comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public string maVar { get; set; }
    Ne respectait pas la convention parce que justement c'est en public...
    Trois possibilités :
    * Ton prof se référait à une convention interne d'écriture. Autrement dit un style imposé par l'établissement / l'entreprise. Dans ce cas ce n'est pas une question fonctionnelle, simplement une obligation de conformité au style local.
    * Tu as mal compris ce que t'as dit ton prof. N'a t-il pas plutôt dit que le setter doit être privé ? Ce qui serait possible avec { get; private set; }
    * Ton prof a mal compris les propriétés automatiques, ou il a mal compris ton problème, ou tu lui as mal expliqué, ou c'est un obsédé du contrôle obtus.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ou alors il parle de manière générale, et en .net une propriété est l'équivalent de 2 méthodes, enfin une méthode pour le set et une function pour le get, mais ceci c'est après compilation
    donc autant utiliser une propriété plutot que de faire 2 méthodes
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Citation Envoyé par Naografix Voir le message
    Donc sa façon a lui est de le mettre en private et de faire les deux fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private string maVar;
    public string FonctionGet{......}
    public string FonctionSet{......}
    C'est la technique employée quand on fait du Java (par exemple). La technique du get;set; en C# existe justement pour simplifier l'écriture et éviter d'avoir à déclarer une variable privée ainsi que deux fonctions juste pour l'exposer publiquement...

    Citation Envoyé par Naografix Voir le message
    Pour moi, ayant chercher un peu sur le net, j'ai compris que déclarer de façon direct (comme dans mon premier exemple) était une façon de faire un getset standard, donc on affecte et on recupere simplement.
    Et ensuite si on voulait ajouter (par exemple), ou faire des choses intermédiaire, dans une valeur dans ma propriété, et bien il fallait que je le fasse en entier (donc en déclarant les fonctions).
    Pas besoin de fonction, tu peux écrire du code dans le get;set;

    Pour résumer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public string Toto { get; set; }
    est identique à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private string _toto;
     
     
    public string Toto
    {
        get { return _toto; }
        set { _toto = value; }
    }
    Si tu veux faire un truc intermédiaire:

    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
    private string _toto;
     
     
    public string Toto
    {
        get { 
              // je tape mon code ici
              maFonctionQuiFaitUnTruc();
              return _toto;
        }
        set { 
            _toto = value;
            // je tape mon code ici
           maFonctionQuiFaitUnTruc();
     }
    }
    De la doc à lire: http://msdn.microsoft.com/fr-fr/library/x9fsa0sw.aspx
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Ou peut être son prof est habitué au java.
    En C# tu peux voire les différentes possibilités grâce au snippet prop, propfull ...
    Juste a taper prop dans visual studio choisir celle qui t'intéresse et faire TAB

  11. #11
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    Bonjour,

    Ce dont tu parle est en fait une convention, une bonne pratique de la POO qui est l’encapsulation.
    Il y a plusieurs manière d'encapsuler ou plusieurs raison, quelque exemple :

    - Vérifié la valeur avant affectation afin de gérer les erreurs
    - Permettre d'exposer une valeur simple alors que son fonctionnement est complexe
    - Tout simplement découpler le code et les méthodes.

    La manière d'encapsuler dépend du langage, par exemple en JAVA la notion de propriété n'existe pas, et l'on doit écrire tout les accesseur à la main (ce que fait ton Professeur avec les propriétés).
    En c# deux mécanisme nous sont offertes, et il y a des raison pour cela.
    La propriété à une notion forte de Classe et donc correspond à une caractéristique, une méthode a une notion forte de service et correspond plus à un traitement (je simplifie).

    C'est pour cela que ce que fait ton professeur, est un peu "idiot", il mélange les notions et alourdi le code. Comme il à été dit plus haut, quand tu écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public object Test {get; set;}
    Le compilateur lui génère en quelque sorte le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private object _Test;
     
    public object Test {
    get{ return _Test;
    set {_Test = value;}
    }
    Quand à la notion de public private protected avec getter exposé ou non ect..... Cela dépend de comment tu conçoit le fonctionnement de ta classe.
    "Le train de tes injures roule sur le rail de mon indifférence."

    "Monde de merde !!"

    Georges Abitbol.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut
    Je comprends de mieux en mieux comment utiliser ce fameux getSet, je dirais même que c'est bon, tout est clair ^^

    Bref, je vois maintenant comment utiliser le get set facilement et proprement !

    Merci encore !


    Resolu pour moi, je met le tag Resolu ? Ou je laisse ouvert a d'autre précision ?

Discussions similaires

  1. Problèmes sur Get Set d'une variable.
    Par Mattk dans le forum Windows Forms
    Réponses: 5
    Dernier message: 07/04/2007, 01h43
  2. get set modifier valeur
    Par jcaspar dans le forum Langage
    Réponses: 1
    Dernier message: 11/03/2007, 01h36
  3. fonction générique pour get set et change
    Par tretsois dans le forum C++
    Réponses: 9
    Dernier message: 18/02/2007, 18h28
  4. Réponses: 7
    Dernier message: 23/01/2007, 11h08
  5. [VB6]Property Get/Set avec groupe de contrôles
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/01/2006, 12h09

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