## 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;