Partage
  • Partager sur Facebook
  • Partager sur Twitter

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

    31 janvier 2021 à 13:19:26

    Salut à tous,

    J'ai appris sur le cours d'OC que la syntaxe :

    public string Nom
            {
                get
                {
                    return nom;
                }
                set
                {
                    nom = value;
                }
            }

    Faisait la meme chose que :

    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 :

    Cela affiche :

    "nom : Jean
    prenom : Issou

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

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

    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 !

    edit: 

    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..

    -
    Edité par Javanino 31 janvier 2021 à 14:54:38

    • Partager sur Facebook
    • Partager sur Twitter
      1 février 2021 à 12:35:23

      >donc la sécurité me semble plus élevée..

      Absolument pas, c'est pour cela que l'utilisation des getter/setter directement sortis d'un mauvais cours de JAVA, c'est vraiment pas terrible.

      Il ne faut pas confondre les Properties .NET et les "getters/setters" JAVA complètement débile, même si syntaxiquement, c'est assez proche.

      Les propriétés, ainsi que les "getters/setters" correctement conçus sont là pour maintenir la cohérence (pré-conditions/post-conditions) de l'objet en entier, pas que le champ associé à la propriété.

      >le "Nom" n'est pas rattaché au "nom" contrairement à la première syntaxe, je pense que ça doit venir de là...

      Tout à fait. Le champ automatiquement généré lors de l'utilisation "compact" porte un nom tel qu'il n'est possible pas qu'un code source puisse, par mal chance, déclarer un champ ou une propriété de même nom (nom super long, avec des caractères interdits dans du code sources, comme ">" ou "<").

      Dans votre première version, la "non-compact", vous avez oublié de définir le champ stockant la valeur de la propriété.

      Dans la version compacte, vous n'avez pas à spécifier un champ car il est automatiquement créé par la compilateur.

      La version "non-compact" est la version "historique" et est plus polyvalente que la version compacte.

      La version "compacte" est apparue plus tard, car pour des propriétés "débiles" (nécessaires pour des frameworks, préparation pour un héritage, etc...) cela demandait beaucoup de code sans aucune valeur (déclaration des champs, toujours une implémentation d'une ligne pour le set et le get).

      Pour simplifier le code, la version compacte est plus efficace. Mais ce n'est pas du "pur" syntaxical sugar car le nom des champs de stockage des données n'est pas pilotable (et ne collisionne pas avec le code "fait main").

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

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

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown