Frage

In ein paar Wochen werde ich eine Klasse im ersten Jahr Ingenieure die wichtigsten Punkte der Referenzen in C # als Teil ihres ersten Jahres Programmierkurs unterrichten. Die meisten von ihnen haben noch nie zuvor programmiert und hatte genug Ärger Lernobjekte, so Lehre Referenzen wird ein harter Kampf sein. Ich plane für die Schüler zur Verfügung viele Beispiele haben sich auf ihre eigenen zu gehen, sondern nur dazu neigt, ein paar Beispiele, die zeigen überwältigend zu sein recht, wenn das das zugrunde liegende Konzept nicht ‚Klick‘.

So habe ich die Frage, um die Gemeinschaft SO setzen werde: Was ist der beste Weg, Sie Referenzen gelehrt gesehen haben? Was hat es für Sie ‚Klick‘? Gibt es ein Referenz-bezogene Material, das ich fehlte?

Mein vorläufiger Stundenplan ist:

  1. Was ist eine Referenz (unter Verwendung eines all die Feinheiten von Objektreferenzen werden von Wert übergeben)
  2. Eine Handvoll böse Beispiele, die zu unerwarteten Ergebnissen führen, wenn Sie nicht 1-5 verstehen.
War es hilfreich?

Lösung

Eine Möglichkeit, dass ich gehört habe, ist es erklärte ein Handy oder Walkie-Talkie zu verwenden. Sie (der Lehrer) halten ein Ende und erklären, dass Sie eine Objektinstanz sind. Sie wohnen in einem Ort (dh. Der Heap), während die Studenten das andere Ende passieren (die auf Lautsprecher ist, wenn es ein Handy) um die Klassenzimmer.

Sie können mit Ihnen durch die „Referenz“ sie haben Sie interagieren, aber sie haben nicht wirklich „Sie“ in ihrem Besitz.

Andere Tipps

Ich mag die URL Analogie, die die Unterschiede zwischen Referenz- und Werttypen beschreibt. Sie können bis zu einem gewissen Inhalt um eine URL als Referenz übergeben. Sie können diese URL ändern, ohne dass der Inhalt zu ändern. Sie können auch auf den Inhalt über die URL erhalten, um vielleicht den Inhalt zu ändern.

Dies ist ein nützlicher Hinweis:

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

Versuchen Sie Referenzen mit Zahlen zu erklären , als reiner Text manchmal nicht bekommen die meisten Menschen durch. Viele Ressourcen und Bücher zum Thema, versuchen Sie durch Zahlen zu erklären, da es schwierig ist Zuweisung durch verbale Kommunikation allein zu beziehen (dies ist meist eine Frage der Aufmerksamkeitsspanne für die meisten Menschen).

zumindest versuchen, darauf zu hinweisen, wie Objekte miteinander in Beziehung stehen, ein einfaches Beispiel wäre eine einfache Referenz sein.

Gegeben:

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

class B {
   int mine = 1;
}

Wenn Instanziieren Klasse A als Objekt a aus einem bestimmten Kontext der folgenden Abbildung wird veranschaulichen, wie alles in dem Haufen aussehen wird. Der Punkt der Abbildung ist zu zeigen, wie die verschiedenen Objekte miteinander in Beziehung stehen und haben ein mentales Modell dafür, wie der Haufen funktioniert.

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

Versuchen Sie auch den Unterschied zwischen Heap und Stack-Zuweisung zu erklären. Aufruf einer Methode mit Parametern. Ein einfaches Beispiel wäre so etwas wie dies:

Bei der folgenden Methode:

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

Wenn doSomething Aufruf und lassen sie tun es Zeug, an dem Stapel Ende doSomething etwas wie unten aussehen wird. Der Punkt, das zeigt, dass Objekte nicht direkt in einem Stapel befinden, aber es ist nur in der Halde zu einem Objekt bezeichnet und Objekte werden durch Verweise geteilt.

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

Ein weiteres anschauliches Beispiel würde ein Array zeigt, die ein Objekt ist, und ein mehrdimensionales Array enthält ein Array von Arrays.

Ich fand diesem Artikel wirklich nützlich für explaning Parameterübergabe in C #. Der Artikel auch macht einen guten Job zu erklären Wert und Referenztypen im Allgemeinen.

Es ist eher eine visuelle Darstellung, die mir sehr geholfen.

Bilder und Diagramme.

Die Menschen bilden mentale Bilder der Konzepte sie lernen, und eine visuelle Darstellung von Referenzen und ihre Beziehung zu ihren zugehörigen Objekten ist ein guter Weg zu beginnen. Ebenso Visualisierung Objekt als Aufnahmeelement Variablen und Mitglied Methoden , a la UML-Diagramme, ist sehr hilfreich (die Verweise auf andere Objekte enthält).

Sie können später in die Details vertiefen, wie Referenzen und primitive Typen tatsächlich umgesetzt werden, wenn Sie das Bedürfnis verspüren, dies zu tun. Aber verzögern diese Diskussionen so lange wie möglich, als Menschen bei dem Versuch festgefahren Runter abstrakte Konzepte zu den gegenständlichen Details zu paaren, die vom Lernen der abstrakten Konzepte ablenkt.

Als ich VB6 lernte, Referenzen verwirrte mich tatsächlich ein wenig. Dann versuchte ich das Lernen C ++, und nach mit Zeigern zu tun, Verweisen perfekten Sinn für mich. es von einer Was-ist-wirklich-passiere Perspektive zu verstehen, war mir leichter, als es von einer oo-Konzepten Perspektive zu verstehen. Vielleicht können Sie das unter der Motorhaube Sachen in Ihren Unterricht gehen.

Ich würde vorschlagen, eine der Nutzung des bloßen Begriffs „Referenz“ insgesamt minimiert werden, da es in .net verwendet werden kann, um zwei sehr verschiedene Dinge zu beziehen: der Inhalt der Klasse-Typ Speicherplatz und Parameter mit einem „ref übergaben "Qualifier. Verwenden Sie die Begriff "Objektreferenz" für die ehemaligen und "ref Parameter" für die letztere.

Bei der Beschreibung, was eine „Objektreferenz“ ist, würde ich vorschlagen, den Begriff „Objekt-ID“ verwenden. Objekt-IDs haben ein paar Dinge, die sie sich von „Adressen“ machen:

  1. kann man nicht tun sehr viele Dinge mit dem Objekt-IDs. Man kann prüfen, ob ein leer ist, prüfen, ob zwei von ihnen gleich sind, kopieren Sie ein zu einem Lagerort geeigneter Typ oder das Objekt schauen, auf die sich ein und stellen es etwas zu tun. Die meisten Anfragen etwas mit einem Klasse-Typ Wert oder eine Variable zu tun, sind Anfragen wirklich etwas mit dem genannten-zu-Objekt zu tun. Beachten Sie, dass man nicht eine ID eines Objekts in einer solchen Art und Weise manipulieren kann als die ID eines anderen zu bekommen, wie man mit den Adressen zu tun.
  2. Während das System ein Mittel zur Umwandlung von Objekt-IDs zu Adressen haben muß, gibt es keine Garantie, dass es keine besonderen Mittel, dies zu tun verwenden. Es gibt auch keine Garantie dafür, dass das Bitmuster mit einer Objekt-ID zugeordnet wird nicht spontan ändern; alles, was garantiert, dass, wenn das Bitmuster das neue Muster auf das gleiche Objekt wie die alten ändert, beziehen.
  3. Das System verfolgt jeden Ort, die Objekt-ID gespeichert werden. Solange jede Kopie einer Objekt-ID vorhanden ist, wird das Objekt ID nie etwas anderes als die Objektinstanz beziehen, für die sie erstellt wurde. Im Gegensatz dazu in der Regel Systeme, die Adressen für Dinge verwenden nicht jeden einzelnen Ort verfolgen, wo eine Adresse könnte kopiert werden. Es ist möglich, dass ein Objekt könnte aufhören zu existieren, während jemand noch eine Kopie seiner Adresse hat, und einige neue Objekt möglicherweise mit derselben Adresse erstellt werden.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top