Referenz- und Wert-Typen: Was ist der Unterschied in .NET?

Selbst Profi-Entwickler sind nicht durchweg firm in den Grundlagen der .NET-Programmierung. Immer wieder gibt es beispielsweise Probleme mit der Unterscheidung von Referenz- und Wert-Typen. ZDNet gibt einen Überblick.

Referenz-Typen speichern einen Verweis auf die Speicheradresse eines Werts auf dem Heap. Sie können selbstbeschreibende Typen, Zeiger-Typen oder Schnittstellen-Typen sein. Der Datentyp kann aus den Werten von selbstbeschreibenden Typen bestimmt werden. Selbstbeschreibende Typen unterteilen sich wiederum in Arrays und Klassen-Typen. Die Klassen-Typen sind benutzerdefinierte Klassen, per Boxing verpackte Wert-Typen und Methodenzeiger.

Das .NET-Framework enthält eine Vielzahl von Referenz-Typen. Beispiele sind das String-Objekt samt allen weiteren Arrays – auch wenn deren Elemente Wert-Typen sind -, Klassen-Typen und Methodenzeiger. Letztlich ist alles, was von der Objekt-Klasse erbt, ein Referenz-Typ. Das heißt, auch jedes erstellte Objekt ist ein Referenz-Typ.

Eine Möglichkeit zum Identifizieren eines Referenz-Typs besteht in der Verwendung des Schlüsselworts new, das nicht für Wert-Typen verwendet wird. Der folgende C#-Codeschnipsel zeigt das Erstellen eines StringBuilder-Objekts, das ein Referenz-Typ ist.


StringBuilder sb = new StringBuilder();

Wenn die Runtime-Engine auf Referenz-Typen stößt, weist sie ihnen zwei Speicherplätze zu: einen für das eigentliche Objekt (StringBuilder im obigen Beispiel) und einen für dessen Referenz (sb im obigen Beispiel). Das eigentliche Objekt wird auf dem verwalteten Heap abgelegt, so dass es vom Speicherbereiniger erfasst wird. Die dispose-Methode findet Verwendung, um den belegten Speicher freizugeben und das Objekt für den Speicherbereiniger verfügbar zu machen.

Andererseits wird die Referenz auf das Objekt auf dem Stack gespeichert. Wenn man Referenz-Typen benutzt, wird das Schlüsselwort ref sowohl in der Methodensignatur als auch beim Aufruf in C# verwendet. Dadurch registriert das System, dass eine Referenz auf das Objekt vorhanden ist. In VB.NET wird ByRef in der Methodensignatur verwendet, beim Aufruf der Methode hingegen nichts.

Was charakterisiert Wert-Typen?

Vereinfacht ausgedrückt enthält ein Wert-Typ seine eigenen Daten. Darüber hinaus werden sie entweder auf dem Stack oder direkt innerhalb einer Struktur gespeichert. Wert-Typen können integriert, also von der Runtime-Engine implementiert, benutzerdefiniert oder aufgelistet sein.

Das .NET-Framework enthält zahlreiche integrierte Wert-Typen. Beispiele sind alle numerischen Datentypen, die Klassen Boolean, Char und Date sowie alle Strukturen, auch wenn deren Mitglieder Referenz-Typen sind, sowie Auflistungen. Wert-Typen erben direkt von der System.ValueType-Klasse. Allerdings sind Wert-Typen versiegelt. Es lassen sich also keine anderen Klassen von ihnen ableiten.

Auf Wert-Typen wird direkt zugegriffen. Daher findet das Schlüsselwort new keine Verwendung. Das folgende VB.NET-Codebeispiel demonstriert die Erstellung einer Reihe von Wert-Typen.


Dim counter As Integer
Dim finished As Boolean;
counter = 1;
finished = false;

Da Wert-Typen auf dem Stack gespeichert werden, erfasst sie der Speicherbereiniger nicht. Wenn die .NET-Runtime mit Wert-Typen arbeitet, verwendet sie direkt die zugrundeliegenden Daten. Wert-Typen bezeichnet man auch gerne als leichtere Typen, im Unterschied zu den schwereren Referenz-Typen.

Themenseiten: .NET, Anwendungsentwicklung, Software

Fanden Sie diesen Artikel nützlich?
Content Loading ...
Whitepaper

Artikel empfehlen:

Neueste Kommentare 

Noch keine Kommentare zu Referenz- und Wert-Typen: Was ist der Unterschied in .NET?

Kommentar hinzufügen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *