Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#]propriété d'une propriété

Sujet résolu
    19 août 2011 à 4:09:06

    Bonjour,
    J'aurais un petit problème. J'ai cherché sur internet la réponse, mais sans résultat concluant.
    Votre aide serait très appréciable :) . Le voici :
    J'ai une class (class A) qui a une propriété (X) get;set; qui (affiche/modifie) une variable membre _x (int _x).
    J'ai une class (class B) qui a une propriété (Number) get; qui (affiche) une variable membre _a (A _a).
    Le problème est que dans mon Main j'ai une variable (B b) qui ne peut pas modifer la propriété de la classe B (comme la réinstancifier), mais peut modifier la propriété de la propriété.
    Pourquoi puis-je modifier modifier cette sous-propriété alors que celle qui y "accède" est en lecture seule ? Comment puis-je prévenir cela ?
    Merci :) J'ai essayer de faire ma question la plus claire posible, Désolé d'avance si elle peut être "conne".
    voici mes codes :
    Class A et B:
    class A
        {
            int _x = 0;
            public int X
            {
                get { return _x; }
                set { _x = value; }
            }
        }
        class B
        {
            A _a = new A();
            public A Number
            {
                get { return _a; }
            }
        }
    


    Main:
    class Program
        {
            static void Main(string[] args)
            {
                B b = new B();
                b.Number.X = 5; // Pourquoi je peux ? Number est en lecture seule !
                //b.Number = new A(); provoque un erreur
                Console.WriteLine(b.Number.X.ToString());
                Console.ReadLine();
            }
        }
    
    • Partager sur Facebook
    • Partager sur Twitter
      19 août 2011 à 4:37:30

      Comprends ce que tu fais. Oui tu ne fais qu'accéder en lecture à _a via la propriété Number. Number est une propriété, donc pour la machine virtuelle du C#, l'appeler en lecture revient à appeler une méthode qui retourne _a. Mais quelle est la valeur de _a ? C'est une adresse mémoire. Tu ne modifies pas l'adresse mémoire en elle-même, mais tu modifies les données stockées à cette adresse. ;)

      Voici un beau tableau pour fixer les idées :

      Emplacement mémoire Valeur stockée
      adresse1 (_a) adresse2
      adresse2 données relatives à l'instance _a : emplacement de _x (adresse3), ...
      adresse3 (_x) valeur de _x (pas une adresse : int est un type valeur)


      Tu ne touches donc pas à la valeur de adresse1 (qui est adresse2), mais à la valeur de adresse3.

      En mémoire, il n'y a ni Number ni X, qui sont vus comme des méthodes pour la machine virtuelle : b.Number.X = 5; revient à faire b.GetA().SetX(5);.

      J'utilise la terminologie "adresse mémoire" pour bien que tu comprennes ce qui se passe physiquement. En réalité _a est une référence (_a est de type A, A est une classe, et les classes sont des types référence).

      En retrouve d'ailleurs cela dans le passage de paramètres à des méthodes.

      Je t'invite vivement à lire de plus amples explications dans le paragraphe "Passer des objets en paramètres" du chapitre "Les classes (1/2)" de mon tutoriel sur le C#.
      • Partager sur Facebook
      • Partager sur Twitter
        19 août 2011 à 6:24:23

        La solution, en fait, pourrait être de clôner mon objet via la fonction get; de ma propriété. Mais j'aurais pensé que de la mettre en lecture seule aurait empêché l'écriture, même chez une autre addresse.
        Merci Narvarth, je peux classer ce sujet résolu.

        P.S.: J'aime bien ton image ^^
        • Partager sur Facebook
        • Partager sur Twitter
          19 août 2011 à 11:33:30

          Le clônage est une solution mais l'utilisateur risque de ne pas comprendre pourquoi sa modification n'a pas d'effet.
          Dans ce cas et si ta classe A représente une valeur (un Point par exemple), considère aussi la possibilité de faire de A une structure et pas une classe. Par défaut les structures sont toujours transmises par copie, donc ta propriété Number renverrait automatiquement une copie de _a et pas _a lui-même. Modifier b.Number.X n'aurait ainsi pas de sens et la compilation déboucherait sur une erreur. :)
          • Partager sur Facebook
          • Partager sur Twitter
            19 août 2011 à 20:48:51

            Merci Orwell pour vôtre réponse,
            mais je ne comprends pas pourquoi l'utilisateur ne comprendrait pourquoi il n'a pas pu le modifier car, car je ne veux pas qu'il le modifie. Ce code que je vous ai fournit est recréé de mon projet initial pour vous montrer mon problème, qui dans celui-ci la modification de ce paramètre aurait des désavantages déplaisants. Dans ce projet, d'ailleurs, j'ai bien besoin d'une classe car j'y affecte des méthodes.
            Merci Orwell pour l'attention que vous me portez :)
            • Partager sur Facebook
            • Partager sur Twitter

            [C#]propriété d'une propriété

            × 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