Suchen und Finden
Service
Infos und Kontakt
Teil II Grundlagen von C# (S. 92-93)
4 Datentypen
In diesem Kapitel stellen wir Ihnen die grundlegenden Datentypen des .NET Frameworks vor. Außerdem werden Umgang und Deklaration von Variablen und Konstanten behandelt und es wird gezeigt, wie Werte konvertiert werden können.
4.1 Werte- und Referenztypen 92
4.2 Integrierte Datentypen 94
4.3 Variablen 99
4.4 Konvertierungen und Boxing 103
4.5 Arrays 106
4.6 Aufzählungstypen (enum) 114
4.1 Werte- und Referenztypen
4.1.1 Wertetypen
Die meisten Programmiersprachen bieten eine Reihe so genannter primitiver Datentypen. Dazu gehören beispielsweise ganzzahlige- oder Gleitkommatypen. Diese Datentypen speichern Werte, im Gegensatz zu Verweistypen, die lediglich eine Referenz speichern. Im .NET Framework werden diese Datentypen Wertetypen genannt. Es gibt zwei Arten von Wertetypen, einmal die im .NET Framework integrierten Datentypen und die selbst definierten. Die Unterscheidung, ob ein Datentyp ein Werte- oder Referenztyp ist, erfolgt durch seinen Ursprung. Im .NET Framework ist eine Klasse namens ValueType deklariert, von der alle Wertetypen abstammen.
Da des Öfteren behauptet wird, C# sei vollständig objektorientiert, alles sei ein Objekt usw. werden Sie sich sicherlich fragen, warum denn nicht alles auch ein Referenztyp ist. Ein Objekt ist ein Referenztyp, und wenn alles ein Objekt ist, müsste ja auch jeder Datentyp ein Referenztyp sein. Die Unterscheidung 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.
Bei einem Vergleich zweier Wertetypen beispielsweise wird wirklich verglichen, ob beide Variablen den gleichen Wert beinhalten. Zu diesem Zweck wurde die Methode Equals(), die ValueType von Object erbt, überschrieben. Geändert wurde auch das Verhalten des Datentyps, was die interne Behandlung von Daten angeht. Wertetypen speichern ihre Daten direkt auf dem so genannten Stack, einem Speicher, der für jedes Programm existiert und auf dem Daten abgelegt werden können. Dadurch ist der Zugriff auf die Werte schnell und effizient.
Dass sich die Wertetypen von den primitiven Datentypen anderer Programmiersprachen unterscheiden, wird dadurch deutlich, dass Wertetypen unter .NET durchaus Methoden beinhalten können. Bekanntester Vertreter ist die Methode ToString(), die jeder Wertetyp implementiert und die den enthaltenen Wert als Zeichenkette zurückliefert. Die Unterscheidung zu Referenztypen wird vor allem durch drei Eigenschaften von Wertetypen deutlich:
Wertetypen sind versiegelt, d.h. von ihnen kann nicht abgeleitet werden. Neue Wertetypen müssen von ValueType abgeleitet bzw. als struct implementiert werden. Von Referenztypen kann, wenn nicht explizit anders angegeben, immer abgeleitet werden. Bei der Verwendung von Wertetypen ist es nicht nötig, einen Konstruktor aufzurufen. Bei Verweistypen ist das Pflicht. Wertetypen muss vor ihrer erstmaligen Verwendung ein Wert zugewiesen werden.
4.1.2 Referenztypen
Referenz- oder Verweistypen sind die Datentypen, die bei der Programmierung mit .NET am häufigsten verwendet werden. Da .NET keine Zeiger kennt (bzw. die gesamte Speicherverwaltung intern erfolgt), können solche Datentypen mit einigen Einschränkungen genauso verwendet werden wie Wertetypen.
Einen gravierenden Unterschied (der später noch an Bedeutung gewinnen wird) gibt es dennoch. Variablen, deren Datentyp ein Referenztyp ist, werden auch als Objektvariablen bezeichnet. Die Daten einer Objektvariable werden nicht auf dem Stack abgelegt, sondern auf dem so genannten verwalteten Heap. Das ist ein Speicherbereich, der vollständig von der Garbage-Collection kontrolliert wird. Auf dem Stack befindet sich lediglich der Verweis auf das eigentliche Objekt.
Das Verständnis des Unterschieds zwischen Referenz- und Wertetypen ist elementar für die Programmierung mit .NET. Ein Unterschied besteht in der Initialisierung eines Referenztyps. Während es bei Wertetypen einfach so ist, dass der entsprechenden Variablen ein Wert zugewiesen wird, muss bei Referenztypen explizit ein Objekt erzeugt oder ein bestehendes Objekt zugewiesen werden. Das geschieht über den Operator new. Intern wird durch die Verwendung von new der Konstruktor der zugrunde liegenden Klasse aufgerufen.
Ein weiterer Unterschied besteht in der Art und Weise, wie bei einer Zuweisung verfahren wird. Während bei Wertetypen der wirkliche Inhalt einer Variablen kopiert wird, wird bei Referenztypen nur der Verweis kopiert. Nach einer Zuweisung verweisen also beide Variablen auf das gleiche Objekt – eine Änderung des Werts über die erste Variable würde demnach ergeben, dass auch der Wert der zweiten Variable geändert wäre. Das hat natürlich Auswirkungen. Da zwei Variablen nach einer Zuweisung auf das gleiche Objekt verweisen, bewirkt eine Änderung beim ersten Objekt, dass auch das zweite Objekt geändert wird. Bei Wertetypen ist das nicht der Fall.
Alle Preise verstehen sich inklusive der gesetzlichen MwSt.; Ersparnis im Vergleich zur Printversion























