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 :

Accesseurs C#, utilité ?


Sujet :

C#

  1. #1
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 118
    Points
    118
    Par défaut Accesseurs C#, utilité ?
    Salut la foule,

    Après plusieurs années de développement Java, je suis passé voilà un an et demi au C#. Passage des plus aisé, à l'exception d'un point qui me pose un "problème", les accesseurs C#.

    Depuis la nuit des temps, tous mes profs ont hurlé à qui voulait l'entendre que la bonne méthode pour modifier une valeur dans une classe consistait à utiliser les fameux get et set, et surtout pas l'accès à la variable public. Bref, c'est entré et c'est jamais ressorti...

    Du coup, je ne comprends pas bien l'intérêt des accesseurs C#

    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
     
    public class MyClass {
      private string hello = "Hello World";
     
      public MyClass(){
      }
     
      public string Hello {
        set { hello = value; }
        get { return hello; }
      }
     
      static void Main(string[] args){
        MyClass mc = new MyClass();
        Console.Writeline(mc.Hello);
      }
    }
    Vous l'aurez compris, la ligne Console.Writeline(mc.Hello); va à l'encontre de tout ce que l'on m'a appris, dans la mesure où on a vraiment l'impression d'accéder à une variable public... (contrairement à un getHello() et setHello() où l'encapsulation est bien plus claire)

    Quelle est l'intérêt de cette methode ? Est-ce que l'on ne risque pas de confondre un accès à une variable public et un accesseur ? S'agit-il simplement d'un fonctionnement comme un autre et, ma foi, faut bien s'y habituer ?

    En vous remerciant.

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 215
    Points : 471
    Points
    471
    Par défaut
    L'intérêt est d'alléger la syntaxe.
    Mais si tu y tiens, tu peux créer des méthodes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public string getHello()
    {
       return hello;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void setHello(string nvHello)
    {
      hello = nvHello;
    }
    « Pourquoi faire simple quand on peut faire compliqué ? » (Deuxième principe fondamental de la logique Shadok)

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Le "get" de la propriété Hello correspond exactement à une méthode getHello() et le "set" correspond exactement à une méthode setHello(value).

    Le but est justement de "donner l'impression" d'accéder à un champ public - plus joli, plus intuitif que les fonctions getTruc et setTruc - tout en conservant la même qualité de contrôle sur l'accès aux données (tu n'es pas obligé de définir un get ou un set... et tu mets ce que tu veux dedans, même s'il est recommandé de ne pas y mettre de traitement lourd...)

    Voir ce topic où j'avais répondu un peu plus longuement.

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    Les accesseurs sont en C# des méthodes qui ne disent pas leur nom.
    Quand tu écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      public string Hello
     {
        set { hello = value; }
        get { return hello; }
      }
    le compilateur va te générer (en gros) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      public void setHello(String value);
     {
        this.hello = value;
      }
      public string getHello();
     {
        return this.hello;
      }
    Après, effectivement, tu verras un mc.Hello dans ton code, mais je trouve assez pratique d'utiliser un nom unique pour l'obtention et l'affectation (notamment dans le cadre de la réflexion), mais c'est certainement une question d'habitude... Normalement, tu ne peux pas confondre avec un champ, qui doit commencer par une lettre minuscule. Libre à toi d'écrire directement les GetHello et SetHello si tu préfères.

    [Edit]Désolé, j'ai répondu en même temps qu'Astartee[/Edit]

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Points : 780
    Points
    780
    Par défaut
    Non, ce n'est pas une variable, c'est une propriété...

    Je vois pas ou est le problème

    Ne pas placer les membres en public permet d'empecher selon la convenance le get ou set.

    Avec l'accesseur, tu peux retirer ton set, et sécuriser le membre souhaité, mais toujours le laisser accessible en get...

    Il s'agit d'un simple confort de programmation : en msil la propriété est transformée en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public string get_Hello();
     
    public void set_Hello(string value);

    [edit] grillé....
    A non, j'ai apporté la précision du "_" : merci reflector [/edit]

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    ouaaaah le tir groupé

  7. #7
    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
    Venant de Java il est vrai que cela peut "pertuber", mais il n'y a pas de risque de confondre un accès via une variable publique ou via une propriété (ce que tu appelles accesseur).

    Les EDI sont assez bien fait pour distinguer une propriété d'un champ et cela peut aussi passer par de la rigueur point de vue syntaxe du codage (casse Pascal pour les propriétés et Caml pour les champs par exemple).

    Personnellement je trouve les propriétés plus sympathiques et "intuitives" au final, plutôt que d'avoir des méthodes Get/Set comme en Java
    Pas de questions techniques par MP

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Points : 780
    Points
    780
    Par défaut
    Citation Envoyé par StormimOn
    , plutôt que d'avoir des méthodes Get/Set comme en Java
    Au moins on y accede avec son nom, car vive l'intellisence avec 1000 gettruc() et settruc()...

  9. #9
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    L'intérêt est de fournir un mécanisme simple à devélopper pour le créateur, et pratique à utiliser pour l'utilisateur de la classe.
    ça permet d'encapsuler une valeur qui apparait comme simple de l'extérieur de la classe, tout en pouvant faire des traitement supplémentaires dans la classe en interne.
    Dans ton exemple, tu ne fais rien de particulier dans les get et set. Mais quand on développe des composants graphiques par exemple, on a des choses de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public Color BackColor
    {
        get { return _backColor; }
        set { _backColor = value; Invalidate(); // Pour redessiner avec la nouvelle couleur
        }
    }
    EDIT : Diantre ! J'arrive après la bataille, mais la prochaine fois, estimés collègues, ayez pitié des gens comme moi qui tapent avec des mouffles :
    postez moins vite
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  10. #10
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 118
    Points
    118
    Par défaut
    Merci pour ces réponses, c'est donc bien une histoire de syntaxe à assimiler, il n'y a pas d'autres raisons plus profondes Bon ben je vais m'y mettre franchement, en espérant que, si je repasse à Java, je puisse retrouver mes reflexes get et set

Discussions similaires

  1. Utilité d'un pointeur vers une fonction ?
    Par Nasky dans le forum C
    Réponses: 10
    Dernier message: 20/03/2010, 19h54
  2. Ambiguïté concernant l'utilité des accesseurs
    Par phenomeno dans le forum Général Java
    Réponses: 7
    Dernier message: 21/09/2009, 20h35
  3. [LG]Utilité du type enuméré ?
    Par tarbala dans le forum Langage
    Réponses: 2
    Dernier message: 10/12/2003, 16h20
  4. Le BIOS et son utilité
    Par le mage tophinus dans le forum Assembleur
    Réponses: 75
    Dernier message: 21/11/2003, 15h37
  5. utilité du binaire et hexadecimaux?
    Par souris78 dans le forum C
    Réponses: 9
    Dernier message: 01/07/2003, 15h08

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