3.4 Referenz- und Wertetypen 

Das .NET-Typsystem kennt nicht nur Klassen zur Beschreibung von Typen. Insgesamt gibt es fünf elementare Typen, die.NET uns zur Verfügung stellt:
- Klassen (class)
- Strukturen (struct)
- Delegates (delegate)
- Interfaces (interface)
- Enumerationen (enum)
Im weiteren Verlauf dieses und der nächsten Kapitel werden Sie noch alle kennenlernen. An dieser Stelle soll aber bereits erwähnt werden, dass sich die fünf Typdefinitionen zwei Kategorien zuordnen lassen:
- Wertetypen
- Referenztypen
Zu den Wertetypen werden primitive Datentypen wie int und long sowie alle anderen auf Strukturen und Enumerationen basierenden Typen gezählt. Zu den Referenztypen gehören beispielsweise der Typ String, alle Arrays und – ganz allgemein ausgedrückt – alle Klassen. Obwohl es im ersten Augenblick den Anschein haben mag, dass hinter Wertetypen nur »normale« Dateninformationen stehen, werden auch diese als Objekte angesehen und hinter den Kulissen der .NET-Laufzeitumgebung als solche behandelt.
Der Unterschied zwischen Referenz- und Wertetypen ist in der Allozierung des Systemspeichers zu finden. Eine Variable, die einen Wertetyp repräsentiert, alloziert auf dem Stack Speicher für die Daten. Der Stack ist im RAM angesiedelt, wird aber vom Prozessor durch einen sogenannten Stack Pointer direkt unterstützt. Dieser ist in der Lage, auf dem Stack neuen Speicher zu reservieren, kann ihn aber auch freigeben. Dieses Verfahren ist sehr effizient und schneller als das Allozieren von Speicher im Heap für Referenztypen. Als Heap wird der Speicher im RAM bezeichnet, der allgemeinen Zwecken zur Verfügung steht.
Wird mit
int value = 100;
eine int-Variable deklariert, wird der Wert in den Stack geschrieben, weil ein Integer als Struktur definiert ist. Beachten Sie bitte, dass bei einem Wertetyp wie dem Integer der new-Operator zur Initialisierung nicht angegeben werden muss. Bei einem Referenztyp ist das eine unabdingbare Forderung, denn erst mit
Circle kreis = new Circle();
wird auf dem Heap ein Speicherbereich alloziert und initialisiert, auf den danach die Referenz kreis zeigt.
Ein daraus folgendes, wichtiges Unterscheidungsmerkmal zwischen Referenz- und Wertetypen ist, dass Wertetypen niemals den Inhalt null haben können.
Bemerkenswert ist die unterschiedliche Wirkungsweise des Zuweisungsoperators zwischen einem Werte- und einem Referenztyp. Betrachten Sie dazu zunächst das Codefragment eines Wertetyps:
long lngFirst = 64; long lngSecond = lngFirst;
Nach der Ausführung des Codes existieren zwei Variablen vom Typ long, die denselben Inhalt haben. long wird von der Common Language Runtime (CLR) als Wertetyp angesehen und entsprechend behandelt. Die Änderung des Inhalts der Variablen lngFirst wird sich nicht auf den Inhalt der Variablen lngSecond auswirken, weil zwischen den beiden keine Verbindung existiert. Der Inhalt von lngFirst wird nur nach lngSecond kopiert. Das ist bei Objekten, die auf Referenztypen basieren, ganz anders und wurde bereits in Abschnitt 3.3.3, »Mehrere Referenzen auf ein Objekt«, erläutert.