Question

Dans quelques semaines, j'enseignerai les points de repère saillants en C # à une classe d'ingénieurs de première année dans le cadre de leur cours de programmation de première année. La plupart d'entre eux n'ont jamais programmé auparavant et ont eu suffisamment de difficulté à apprendre des objets. Enseigner les références va donc être une bataille ardue. Je prévois de disposer de nombreux exemples que les étudiants pourront consulter eux-mêmes, mais le simple fait de montrer de nombreux exemples est plutôt déconcertant si le concept sous-jacent ne «clique pas».

Je vais donc poser la question à la communauté SO: quelle est la meilleure façon de voir les références enseignées? Qu'est-ce qui vous a permis de cliquer? Y a-t-il des documents relatifs aux références qui me manquent?

Mon plan de cours provisoire est le suivant:

  1. Qu'est-ce qu'une référence (à l'aide de argument comme celui d'Eric Lippert )
  2. Références et le ramasse-miettes
  3. Types de référence et types de valeur
  4. Types immuables
  5. Passage par référence ou passage par valeur (et toutes les subtilités des références d'objet passées par valeur)
  6. Une poignée d'exemples méchants qui produisent des résultats inattendus si vous ne comprenez pas les points 1 à 5.
Était-ce utile?

La solution

L’une des façons dont j’ai entendu parler est d’utiliser un téléphone portable ou un talkie-walkie. Vous (l'instructeur) détenez une extrémité et déclarez que vous êtes une instance d'objet. Vous restez au même endroit (c’est-à-dire le tas) pendant que les étudiants dépassent l’autre extrémité (le haut-parleur s’il s’agit d’un téléphone portable) dans la salle de classe.

Ils peuvent interagir avec vous par le biais de la "référence". ils ont à vous, mais ils n'ont pas vraiment "vous" en leur possession.

Autres conseils

J'aime l'analogie d'URL qui décrit les différences entre les types référence et valeur. Vous pouvez transmettre une URL en tant que référence à un contenu. Vous pouvez modifier cette URL sans modifier ce contenu. Vous pouvez également accéder au contenu via l’URL pour éventuellement modifier le contenu.

C’est une référence utile:

 http://www.yoda.arachsys.com/csharp/parameters.html

Essayez d’expliquer les références avec des chiffres , car un texte pur ne parvient parfois pas à la plupart des gens. Beaucoup de ressources et de livres sur le sujet essaient d'expliquer par des chiffres car il est difficile de relier l'allocation par la seule communication verbale (il s'agit principalement d'une question de durée d'attention pour la plupart des gens).

Essayez au moins de préciser les relations entre les objets. Un exemple simple serait une simple référence.

Donné:

class A {
    B b = new B();
}

class B {
   int mine = 1;
}

Lors de l'instanciation de la classe Un en tant qu'objet un à partir d'un contexte, la figure suivante illustre son apparence dans le tas. Le but de l’illustration est de montrer la relation entre les différents objets et d’avoir un modèle mental pour le fonctionnement du tas.

         +-A-----+
a: *---->|       |
         |       |   +-B--------+
         | b: *--+-->|          |
         |       |   | mine: 1  |
         +-------+   |          |
                     +----------+

Essayez également d’expliquer la différence entre l’allocation de tas et de pile. Appeler une méthode avec des paramètres. Exemple simple serait quelque chose comme ceci:

Avec la méthode suivante:

public void doSomething(B b) {
   int doMine = b.mine + 1;
}

Lorsque vous appelez quelque chose et que vous le laissez faire, à la fin, la pile de quelque chose ressemblera à ce qui suit. Point indiquant que les objets ne résident pas directement dans une pile, mais qu’il est simplement fait référence à un objet du tas et que les objets sont partagés par le biais de références.

whoever called doSomething *
                           |
                           v
+-doSomething-+   +-B--------+
| b: *--------+-->|          |
|-------------|   | mine: 1  |
| doMine: 2   |   +----------+
+-------------+

Un autre exemple illustratif serait un tableau qui est un objet et un tableau multidimensionnel contient un tableau de tableaux.

J'ai trouvé cet article vraiment utile pour paramètre explicatif passant en C #. L'article explique également très bien les types de valeur et de référence en termes généraux.

Il s’agit plus d’une représentation visuelle qui m’a beaucoup aidé.

Images et schémas.

Les gens forment des images mentales des concepts qu'ils apprennent et une représentation visuelle des références et de leur relation avec leurs objets associés est un bon moyen de commencer. De même, il est très utile de visualiser objet en tant que membre variable (qui inclut des références à d'autres objets) et membre , , comme un diagramme UML.

Plus tard, vous pourrez approfondir les détails de la manière dont les références et les types primitifs sont réellement implémentés, si vous en ressentez le besoin. Mais retarder ces discussions aussi longtemps que possible, car les gens peuvent s’enliser en essayant d’apparier des concepts abstraits aux détails de la représentation, ce qui les distrait de l’apprentissage des concepts abstraits.

Quand j’apprenais le VB6, les références me confondaient un peu. Ensuite, j'ai essayé d'apprendre le C ++ et, après avoir traité les pointeurs, les références me paraissaient parfaitement logiques. Il était plus facile pour moi de comprendre cela du point de vue de ce qui se passait réellement que de le comprendre d'un point de vue oo-concept. Peut-être pouvez-vous passer en revue les éléments cachés de votre cours.

Je suggérerais de minimiser l'utilisation du terme "référence" dans l’ensemble, car il peut être utilisé dans .net pour faire référence à deux choses très différentes: le contenu des emplacements de stockage de type classe et les paramètres passés avec un "ref". qualificatif. Utilisez le terme "référence d'objet". pour l'ancien, et "paramètre de référence" pour ce dernier.

En décrivant ce qu'est une "référence d'objet" est, je suggère d'utiliser le terme "ID d'objet". Les identifiants d'objet ont quelques particularités qui les différencient des "adresses":

  1. On ne peut pas faire beaucoup de choses avec les ID d'objet. On peut vérifier si l'un est vide, vérifier si deux d'entre eux sont égaux, en copier un dans un emplacement de stockage de type approprié ou rechercher l'objet référencé par l'un et lui demander de faire quelque chose. La plupart des demandes de faire quelque chose avec une valeur ou une variable de type classe sont en réalité des demandes de faire quelque chose avec l'objet référencé. Notez que l'on ne peut pas manipuler l'ID d'un objet de manière à obtenir l'ID d'un autre, comme on peut le faire avec des adresses.
  2. Bien que le système doive disposer d'un moyen de convertir les ID d'objet en adresses, rien ne garantit qu'il utilisera un moyen particulier pour le faire. Rien ne garantit non plus que le modèle de bits associé à un ID d'objet ne changera pas spontanément; tout ce qui est garanti, c'est que si le motif de bits change, le nouveau motif fait référence au même objet que l'ancien.
  3. Le système garde une trace de chaque endroit où les ID d'objet sont stockés. Tant qu'une copie d'un ID d'objet existe, cet ID d'objet ne fera jamais référence à autre chose qu'à l'instance d'objet pour laquelle il a été créé. En revanche, en général, les systèmes qui utilisent des adresses pour des objets ne suivent pas tous les endroits où une adresse peut être copiée. Il est possible qu'un objet cesse d'exister pendant que quelqu'un a encore une copie de son adresse et qu'un nouvel objet peut être créé avec la même adresse.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top