Ich finde es am hilfreichsten, sich Referenztypen als Objekt-IDs vorzustellen. Wenn eine Variable vom Klassentyp vorhanden ist Car, myCar = new Car();fordert die Anweisung das System auf, ein neues Auto zu erstellen und seine ID zu melden (sagen wir, es ist Objekt Nr. 57). es setzt dann "Objekt # 57" in die Variable myCar. Wenn man schreibt Car2 = myCar;, schreibt das "Objekt # 57" in die Variable Car2. Wenn man schreibt car2.Color = blue;, weist dies das System an, das durch Car2 identifizierte Auto (z. B. Objekt Nr. 57) zu finden und es blau zu lackieren.
Die einzigen Operationen, die direkt an Objekt-IDs ausgeführt werden, sind das Erstellen eines neuen Objekts und das Abrufen der ID, das Abrufen einer "leeren" ID (dh null), das Kopieren einer Objekt-ID in eine Variable oder einen Speicherort, der sie enthalten kann, und das Überprüfen, ob zwei Objekt-IDs stimmen überein (beziehen sich auf dasselbe Objekt). Alle anderen Anforderungen fordern das System auf, das Objekt zu finden, auf das sich eine ID bezieht, und auf dieses Objekt zu reagieren (ohne die Variable oder andere Entität zu beeinflussen, die die ID enthielt).
In vorhandenen Implementierungen von .NET enthalten Objektvariablen wahrscheinlich Zeiger auf Objekte, die auf einem durch Müll gesammelten Heap gespeichert sind. Dies ist jedoch ein nicht hilfreiches Implementierungsdetail, da zwischen einer Objektreferenz und anderen Zeigern ein kritischer Unterschied besteht. Es wird allgemein angenommen, dass ein Zeiger den Ort von etwas darstellt, das lange genug stehen bleibt, um bearbeitet zu werden. Objektreferenzen nicht. Ein Codeteil kann das SI-Register mit einem Verweis auf ein Objekt unter der Adresse 0x12345678 laden, es verwenden und dann unterbrochen werden, während der Garbage Collector das Objekt an die Adresse 0x23456789 verschiebt. Das würde sich wie eine Katastrophe anhören, aber der Müll wird die mit dem Code verknüpften Metadaten untersuchen und feststellen, dass der Code SI verwendet hat, um die Adresse des verwendeten Objekts zu speichern (dh 0x12345678). Stellen Sie fest, dass das Objekt mit 0x12345678 in 0x23456789 verschoben wurde, und aktualisieren Sie SI so, dass es 0x23456789 enthält, bevor es zurückgegeben wird. Beachten Sie, dass in diesem Szenario der in SI gespeicherte numerische Wert vom Garbage Collector geändert wurde, auf den jedoch verwiesen wurdedas gleiche Objekt vor dem Umzug und danach. Wenn vor dem Verschieben auf das 23.592ste Objekt verwiesen wurde, das seit dem Start des Programms erstellt wurde, wird dies danach fortgesetzt. Interessanterweise speichert .NET für die meisten Objekte keine eindeutige und unveränderliche Kennung. Bei zwei Snapshots des Arbeitsspeichers eines Programms kann nicht immer festgestellt werden, ob ein bestimmtes Objekt im ersten Snapshot im zweiten vorhanden ist oder ob alle Spuren davon aufgegeben und ein neues Objekt erstellt wurde, das zufällig so aussieht alle beobachtbaren Details.