[c#] Je ne comprends pas les getters/setters
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

[c#] Je ne comprends pas les getters/setters



  1. #1
    lepetitchimiste

    [c#] Je ne comprends pas les getters/setters


    ------

    salut à tous,

    J'ai appris que la syntaxe :

    Code:
    public string Nom
            {
                get
                {
                    return nom;
                }
                set
                {
                    nom = value;
                }
            }
    Faisait la meme chose que :

    Code:
    public string Nom { get; set; }
    Or quand je teste ces 2 syntaxes sur ce petit programme, je n'obtiens pas les memes résultats.
    Voici le cas avec l'écriture la plus lourde :

    ca marche.PNG
    (il faut cliquer sur le lien si l'image ne s'affiche pas)

    Cela affiche :

    "nom : Jean
    prenom : Issou

    nom : Bernard
    prenom : Issou", le setter fonctionne.

    Or quand j'utilise la syntaxe plus réduite :

    ca marche pas.jpg
    (il faut cliquer sur le lien si l'image ne s'affiche pas)

    Cela affiche :

    "
    nom : Jean
    prenom : Issou

    nom : Jean
    prenom : Issou", le setter n'a pas fonctionné.

    Pouvez vous me dire pourquoi et m'expliquer comment fonctionne la syntaxe 2 ?
    Car dans cette syntaxe, le "Nom" n'est pas rattaché au "nom" contrairement à la première syntaxe, je pense que ça doit venir de là...

    Merci d'avance pour vos éclaircissements !

    -----

  2. #2
    Spazi

    Re : [c#] Je ne comprends pas les getters/setters

    Ce que vous avez appris est faux, les 2 écritures ne sont pas identiques.

    La 2ème est une auto-property, c'est à dire que le compilateur ajoutera automatiquement un champ à votre classe, sur lequel s'effectuera les set/get.
    En plus clair, votre
    Code:
    public string Nom { get; set; }
    est transformé en
    Code:
    private string Nomk_BackingField;
    public string Nom
    {
        get
        {
            return Nomk_BackingField;
        }
        set
        {
            Nomk_BackingField = value;
        }
    }
    et vous n'êtes pas sensé directement accédé à ce champ, il est "caché". Vous devez passez par la propriété !


    Du coup, forcément, votre "afficher" ne fonctionne pas vu qu'il accède à votre champ nom, et non la propriété Nom. Donc la propriété auto n'affectant pas votre champ "nom", il ne se passe rien.

    Si vous changiez "afficher" pour qu'elle affiche la propriété Nom, cela fonctionnerait.

    Je pense que la personne qui vous appris que ces déclarations étaient identiques devait parler du concept, pas du résultat.
    Dernière modification par Spazi ; 31/01/2021 à 12h34.

  3. #3
    lepetitchimiste

    Re : [c#] Je ne comprends pas les getters/setters

    Merci pour votre réponse,

    Je l'ai appris sur un cours d'open classroom, c'est surement moi qui ai mal compris.

    Oui ça marcherait si je voulais afficher la propriété Nom mais je trouve ça bizarre de traiter un nom sur deux variables différentes ?
    La première méthode n'est-elle pas plus pratique ?

  4. #4
    Spazi

    Re : [c#] Je ne comprends pas les getters/setters

    Ce sentiment de "bizarre" est normal, vu que cela fait 2 "variables".

    Vu votre code, j'aurais dit au contraire que la 2ème méthode est plus pratique, vu que vous avez écrit beaucoup moins de code ! (le champ nom est obsolète dans la méthode 2)
    Qui plus est, vous ne faites rien de particulier, que ce soit dans le get, ou le set.

    L'intérêt de la 1ère méthode, si on peut dire, est un besoin de faire qq chose d'autre que la méthode "auto" (avoir une vérification de l'input dans le set, le get retourne une valeur d'un tableau plutôt qu'un champ, etc)

    Votre sentiment de bizarrerie est que vous considérer le champ et la propriété comme étant le même chose.

    La propriété, publique, est là pour dire : d'un point de vue extérieure, j'ai quelque chose qui est un string, qui peut être lu (get), et écrit (set)
    Le champ, private, est l'implémentation de cette propriété, et l'implémentation la plus basique. Il est là pour répondre au : comment ma classe va t'elle pouvoir répondre au besoin d'avoir un truc qui doit être un string, et qui doit être accessible en lecture/écriture.

    Mais un champ basique, un get basique, ou un set basique, ne sont pas les seuls possibilités, et vous devez voir plus loin que ça.

    Regardez par exemple un "indexer", la différence accès(get) / implémentation côté classe, sera peut-être plus parlante.
    Dernière modification par Spazi ; 31/01/2021 à 13h15.

  5. A voir en vidéo sur Futura
  6. #5
    lepetitchimiste

    Re : [c#] Je ne comprends pas les getters/setters

    Très bien, bon je ne suis pas certain d'avoir tout saisi mais ça va venir.
    Du coup, si j'utilise la 2eme méthode, je peux enlever le champ "nom" puisqu'en utilisant la 2eme méthode je ne peux pas l'utiliser ?
    Mais dans ce cas la caractérique d'un nom de famille d'une personne ne sera plus privée en utilisant "Nom" ? C'est pas embetant ?

  7. #6
    lepetitchimiste

    Re : [c#] Je ne comprends pas les getters/setters

    Nom : Capture.PNG
Affichages : 296
Taille : 35,0 Ko
    Ici si on remplace le code du dessus par celui du dessous, la propriété Vitesse sera publique, et donc depuis notre classe main on pourra la modifier et la lire.
    Or dans le code du dessus, la propriété vitesse est privée donc la sécurité me semble plus élevée..

  8. #7
    Spazi

    Re : [c#] Je ne comprends pas les getters/setters

    Citation Envoyé par lepetitchimiste Voir le message
    Pièce jointe 431372
    Ici si on remplace le code du dessus par celui du dessous, la propriété Vitesse sera publique, et donc depuis notre classe main on pourra la modifier et la lire.
    Or dans le code du dessus, la propriété vitesse est privée donc la sécurité me semble plus élevée..
    Votre esprit vous joue des tours.
    Dans le 1er cas, le champ "vitesse" n'est pas moins sécurisé. Il suffit d'écrire sur Vitesse pour que vitesse soit impacté


    Il en va de même pour votre post sur le côté private de "nom".
    A partir du moment où vous considérez que votre fonction "main" peut écrire "nom", c'est que "nom" n'est pas privé.
    (Pour le cas d'un "nom", on envisagerai plutôt une propriété en lecture seule, et on ne permettrait de donner le nom que dans le constructeur de la classe)
     Cliquez pour afficher


    ----

    Je vais redonner une autre explication, et déjà, oui, une propriété+champ est une manière compliqué de faire l'équivalent d'un champs, mais ce n'est pas le but.


    Parlons d'un champ.
    Quand vous déclarez un champ, qu'est-ce que vous "faites".
    1) Vous déclarez une zone mémoire, qui en interne contiendra un certain type
    2) Vous avez une fonction de lecture sur cette zone, pour récupérer sa valeur
    3) Vous avez une fonction d'écriture sur cette zone.

    Cela semble bête à dire, puisque évident, il est normal quand on déclare un champ qu'on puisse le lire/écrire.

    Si on passe ce champ en publique, le "problème" est que le 1) est accessible, et on n'a pas très envie de ça en général.

    Conceptuellement, ce qu'on veut, c'est minimiser ce qui est accessible au strict nécessaire, et l' "extérieur" n'a pas besoin de savoir comment on implémente, il n'a besoin que du 2) et 3), une fonction de lecture pour récupérer la valeur et/ou une fonction d'écriture, mais le fait qu'on utilise un champ ? Il n'a pas besoin de le savoir.

    Maintenant, la propriété.
    Quand on la déclare, ben on obtient :
    2) Une fonction de lecture
    3) Une fonction d'écriture

    Ce qui est ce qu'on souhaite !
    Le souci là, c'est que sans implémentation, la propriété n'a pas de zone mémoire où se référer de ce qu'elle est sensé lire et/ou écrire.
    C'est pour ça, que dans les cas/besoins simples, on déclare ... un champ !
    Mais tout ce qui intéresse notre classe dans ce champ, c'est le 1)
    Les fonctions de lecture/écriture sur ce champ n'intéresse que la propriété ! (même la classe n'est pas intéressée par ces fonctions !)
    Dans ces cas simples, il vaut même mieux que vous considériez que vous ne pouvez pas lire ce champ en dehors des fonctions get/set de la propriété.

    D'une certaine manière, c'est ce que fait une auto property.
    Elle vous cache la création de ce champ, et du coup vous ne pouvez pas le lire/écrire directement.
    Seul la propriété le peut.


    Après, le "but" d'une propriété, c'est qu'on peut faire bien plus qu'implémenter ça en utilisant un champ pour le 1).
    Vous pourriez lire/écrire la valeur dans une base de données directement par exemple, ou dans un fichier.
    Ou peut-être que votre propriété retourne la moyenne des températures mesuré sur un thermomètre sur les 15 dernières minutes, donc ce n'est pas juste une bête valeur dans une variable.
    Etc.
    Dernière modification par Spazi ; 31/01/2021 à 14h36.

  9. #8
    Spazi

    Re : [c#] Je ne comprends pas les getters/setters

    N'oubliez pas que vous pouvez écrire tout code dans les get/set d'une propriété, comme par exemple, vérifiez dans le set que l'input est dans un format correct, etc.
    Ce que, si vous exposiez un champ, vous ne pourriez pas faire.

  10. #9
    lepetitchimiste

    Re : [c#] Je ne comprends pas les getters/setters

    Ok merci baucoup, j'ai relu plusieurs fois, je pense avoir compris le principe global, mais je vais pratiquer et je comprendrai encore mieux par la suite.
    A la prochaine

  11. #10
    Fustigator

    Re : [c#] Je ne comprends pas les getters/setters

    Bonjour

    Citation Envoyé par lepetitchimiste Voir le message
    Pouvez vous me dire pourquoi et m'expliquer comment fonctionne la syntaxe 2 ?

    Le getter/setter auto fonctionne de la maniére suivante : quand vous écrivez une propriété Xyz sous la forme :
    Code:
    public unType Xyz
    { 
     get; 
     set;
    }
    le compilateur va créer une variable sous la forme :
    Code:
    private unType _xyz;
    et générer le code des setter/getter sous la forme :

    Code:
    public unType Xyz
    { 
     get
     {
      return _xyz;
     }
     set
     {
      _xyz = value;
     }
    }
    On peut utiliser les getter/setter auto dès l'instant on où l'écriture et la lecture de la propriété ne nécessite pas d'autre traitement que l'affectation ou la lecture de la variable associée.
    De plus, pour des question de lisibilité, on évitera d'utiliser la variable générée automatiquement dans la classe.
    Dernière modification par Fustigator ; 01/02/2021 à 11h22.

Discussions similaires

  1. besoin d'aide pour comprendre les setters et getters en java
    Par herman2018 dans le forum Programmation et langages, Algorithmique
    Réponses: 4
    Dernier message: 02/05/2018, 23h38
  2. besoin d'aide pour comprendre les setters et getters en java
    Par herman2018 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 30/04/2018, 22h39
  3. arg(1+i) ? je ne comprends pas :(
    Par Kinano dans le forum Mathématiques du collège et du lycée
    Réponses: 14
    Dernier message: 05/07/2012, 21h35
  4. Comprends pas
    Par invitee9c0d87a dans le forum Mathématiques du collège et du lycée
    Réponses: 9
    Dernier message: 12/11/2007, 17h33