Datentyp

Aus Das Sopra Wiki
Wechseln zu: Navigation, Suche

In Programmiersprachen gibt es unterschiedlichste Arten von Werten. Diese können Zahlen, Buchstaben, Zeichenketten usw. sein. Damit beliebige dieser Werte abgespeichert werden können, gibt es sogenannte Typen. Variablen werden von einem bestimmten Typ erstellt und können dann auch nur Werte dieses Typs enthalten. Typen sind ein sehr wichtiges Paradigma in Programmiersprachen. Über sie wird gesteuert, was z.B. bei einem Operator, wie dem "+"-Operator passiert, oder einfach, wie mit den Werten, die in Variablen gespeichert sind, umgegangen werden soll.

Die meisten Programmiersprachen bieten eine Reihe so genannter primitiver Datentypen. Dazu gehören beispielsweise Ganzzahl- oder Gleitkommatypen. Im Gegensatz zu Verweistypen (engl. „reference types“), die lediglich eine Referenz zu den Objekten speichern, werden in primitiven Datentypen tatsächliche Werte abgespeichert. Im .NET-Framework werden diese Datentypen Wertetypen (engl. „value types“) genannt. Es existieren zwei Arten von Wertetypen. Zum einen die, die schon in der .NET-Framework integriert sind, zum anderen die selbstdefinierten Datentypen. Alle Wertetypen in .NET werden von der Klasse ValueType abgeleitet.

Da C# als vollständig objektorientierte Sprache gilt, kann man sich die Frage stellen, warum nicht alle Datentypen als Referenztypen behandelt werden. Da ein Objekt ein Referenztyp ist und alles ein Objekt ist, müsste auch jeder Datentyp ein Referenztyp sein. Die Unterscheidung zwischen Referenz- und Wertetypen erfolgt intern durch die Verhaltensweise. Die Klasse ValueType ist direkt von Object (der Basisklasse aller Datentypen und Klassen in .NET) abgeleitet. Sie enthält jedoch andere Definitionen für die Verhaltensweise nach außen, also zum Programmierer hin, als Object.

Führt man beispielsweise eine Vergleichsoperation durch, wird bei einem Wertetyp wirklich verglichen, ob beide Variablen den gleichen Wert haben. Bei Referenztypen nutzt man in der Regel Methoden wie Equals(), die zwei Objekte auf Gleichheit prüfen sollen. Ein weiterer Unterschied besteht in der internen Behandlung. Wertetypen werden auf dem Stack abgelegt, um einen schnellen und effizienten Zugriff zu gewährleisten, wohingegen Referenztypen im verwalteten Heap liegen, dessen Zugriff länger dauert. Lediglich der Verweis eines Referenztyps, also sozusagen der Offset im Heap, liegt auf dem Stack.

Um eine Unterscheidung von Referenz- und Wertetypen zu geben, können drei wichtige Eigenschaften betrachtet werden:

  • Wertetypen sind versiegelt (sealed). Von ihnen kann nicht abgeleitet werden. Neue Wertetypen müssen von ValueType abgeleitet, bzw. als Struct definiert werden. Von Referenztypen kann in der Regel immer abgeleitet werden. (Außer, es wurde anders definiert.)
  • Wenn Wertetypen verwendet werden, ist es nicht nötig, einen Konstruktor aufzurufen. Bei Referenztypen ist dies pflicht.
  • Jedem Wertetyp muss vor seiner erstmaligen Verwendung ein Wert zugewiesen werden.