Une variable de type classe, paramètre, le champ, la valeur de retour, ou tout autre lieu de stockage doit être considéré comme tenant un « id objet ». Si un objet Foo
a une propriété appelée Bar
de type classe qui est sauvegardée par le champ _Bar
et _Bar
contient "ID d'objet # 24601", l'instruction Foo.Bar.Text = "George"
appellera le paramètre Text
sur l'objet # 24601 avec la valeur "George" . Notez que cette instruction ne modifiera pas l'objet Foo
lui-même (son champ _Bar
aura conservé "l'ID d'objet # 24601" avant l'exécution de l'instruction, et le conservera après); cela affectera probablement l'objet # 24601.
Un emplacement de stockage struct-type doit être considéré comme contenant le contenu de tous ses champs (publics et privés).Si Foo.Boz
étaient une propriété de type Rectangle
(qui est un struct) et sur le terrain de support _Boz
, un accès à Foo.Boz
créerait une nouvelle instance temporaire de type Rectangle
, dont tous les champs seraient copiés de ceux de Foo._Boz
. Une tentative de lecture Foo.Boz.X
copierait tous les champs de _Boz
à une instance temporaire, puis accéder au champ X
de cette instance.
Notez que certains compilateurs C# vraiment vieux et mal interpréteraient le code comme Foo.Boz.X = 5;
comme Rectangle temp; temp.X = 5;
, en rejetant la valeur résultante de temp mais sans émettre d'avertissement. Un tel comportement de compilateur a amené certaines personnes à déclarer que les structures devraient être "immuables" pour s'assurer qu'un tel code va générer une erreur de compilateur plutôt que de produire un comportement bidon. Malheureusement, cette croyance persiste à ce jour malgré le fait que tout compilateur décent interdirait un tel code même si X
était un champ mutable.
Notez que la bonne façon idiomatiques de mettre à jour une propriété d'un type struct mutable est:
Rectangle temp = MyListOFRectangles[5];
temp.X = 5;
MyListOFRectangles[5] = temp;
Si Rectangle
est connu pour avoir un champ entier public nommé X
et MyListOfRectangles
est un List<Rectangle>
, on n » t besoin de connaître l'une des propriétés, constructeurs, etc. de Rectangle
pour savoir que le code ci-dessus changera MyListOfRectangles[5].X
mais n'affectera aucune autre propriété de MyListOfRectangles[5]
, ni aucune propriété de MyListOfRectangles[4]
. Nice, clair et facile. Les structures de champ exposé permettent l'édition par morceaux de valeurs d'une manière qui est claire et cohérente, contrairement à tout autre type de type de données.
_nous savons que le nouveau nom de Hook sera appliqué à la valeur sous-jacente de person1_ Eh bien, si le type 'Person' est une ** classe **, alors le getter retournera une ** référence ** à la' Personne ** objet **. Cet objet sera alors muté. Le champ privé 'person1' est une autre référence au même objet. Mais si 'Person' était un ** struct ** alors le getter retournerait une ** valeur ** qui serait une ** copie ** de la valeur de' person1'. Par conséquent, même votre premier code ne fonctionnerait pas si 'Person' était un type de valeur. –