Visual C# 2005 - Grundlagen, Programmiertechniken, Datenbanken

Visual C# 2005 - Grundlagen, Programmiertechniken, Datenbanken

von: Frank Eller

Addison-Wesley Verlag, 2006

ISBN: 9783827322883

Sprache: Deutsch

1097 Seiten, Download: 8113 KB

 
Format:  PDF, auch als Online-Lesen

geeignet für: Apple iPad, Android Tablet PC's Online-Lesen PC, MAC, Laptop


 

eBook anfordern

Mehr zum Inhalt

Visual C# 2005 - Grundlagen, Programmiertechniken, Datenbanken



4 Datentypen (S. 81-82)

Die Datentypen einer Programmiersprache sind die Basis jeder Programmierung. Im Falle von .NET, das ja programmiersprachenunabhängig aufgebaut ist, sind die Datentypen nicht allein für C# definiert, sondern als Bestandteil des .NET Frameworks für alle Sprachen gültig.

4.1 Werte- und Referenztypen

Das .NET Framework ist vollständig objektorientiert und hat eine lückenlose Vererbungskette. Sämtliche Datentypen sind direkt oder indirekt vom Basisdatentyp System.Object abgeleitet. Dennoch unterscheidet das Framework zwischen zwei Arten von Datentypen, Werte- und Referenztypen. Der Ursprung beider ist gleich, das Verhalten jedoch unterscheidet sich. Sollten sie aus einer nicht-objektorientierten Sprache kommen, sind die Unterschiede möglicherweise etwas schwieriger zu verstehen. Dennoch ist das Wissen darum unverzichtbar, da das Verhalten eines Programms durch diese Unterschiede beeinflusst werden kann.

4.1.1 Unterschiede zwischen Werte- und Referenztypen

Der Unterschied zwischen den beiden im .NET Framework vertretenen Arten von Datentypen besteht wie angesprochen nicht unbedingt in der Herkunft. Beide Arten sind auf irgendeine Weise von Object abgeleitet, der ultimativen Basisklasse im .NET Framework. Der Hauptunterschied besteht im Verhalten des Datentyps sowohl intern als auch zum Programmierer hin. Um das zu verstehen, müssen erst zwei andere Begriffe geklärt werden, nämlich Stack und Heap. Bei beiden handelt es sich um eine Speichermöglichkeit für Daten.

Der Stack ist ein Stapelspeicher. Auf ihm werden Werte abgelegt und später wieder entnommen. Derartige Speicher werden auch als Kellerspeicher oder LIFO-Speicher bezeichnet (LIFO=Last In First Out, was als letztes hineingelegt wird wird auch als erstes wieder entnommen). Jede Applikation erhält ihren eigenen Stack, auf den andere Applikationen nicht zugreifen können.

Der Heap ist ein dynamischer Speicher, der vom System verwaltet wird und daher so groß werden kann, wie der maximale Speicher, den das System verwalten kann. Es handelt sich dabei nicht um einen Kellerspeicher, die Anordnung entspricht eher einem verzweigten Baum. Der Zugriff ist wahlfrei, Daten können also auch mittendrin entnommen werden. Im Falle von Referenztypen (auch als Objekte bezeichnet) liegen die Werte eines solchen Datentyps im Heap.

Parameterübergabe

Müssen Daten zwischengespeichert werden, beispielsweise wenn ein Methodenaufruf erfolgt und Parameter übergeben werden, passiert im Falle eines Wertetyps folgendes: Der enthaltene Wert wird auf den Stack abgelegt. Die Methode wird aufgerufen, und es wird erkannt, dass ein Parameter übergeben wurde. Der entsprechende Wert wird nun wieder vom Stack entnommen. Das Resultat ist, dass innerhalb der Methode eine Kopie des Werts existiert.

Bei Referenztypen läuft die Sache ein wenig anders. Wird einer Variablen ein Referenztyp, ein Objekt, zugewiesen, so liegen die Daten dieses Objekts auf dem Heap. Die Variable speichert nicht etwa die Werte, sondern lediglich eine Referenz auf die Daten, die auf dem Heap ohnehin vorhanden sind. Wird nun eine solche Variable als Parameter an eine Methode übergeben, passiert genau das Gleiche: Der in der Variablen enthaltene Wert wird auf den Stack gelegt, die Methode aufgerufen und der Wert wieder entnommen. Der Unterschied ist jedoch, dass der Wert nur eine Referenz auf die Daten darstellt. Das bedeutet, innerhalb der Methode existiert nur eine Kopie der Referenz. Werden nun Daten geändert, so geschieht dies auf dem Heap – und zwar an der gleichen Stelle. Die Werte im ursprünglichen Objekt werden also ebenfalls geändert. Bei Wertetypen passiert das nicht, da der Wert kopiert wird.

Dieser Unterschied ist einer der Hauptunterschiede und auch einer der wichtigsten. Durch das unterschiedliche interne Verhalten ergibt sich auch für den Programmierer ein Unterschied – er muss darauf achten, was er einer Methode übergibt. Soll wirklich eine Objektkopie übergeben werden (und damit ein Ändern der ursprünglichen Werte ausgeschlossen werden), muss die Kopie explizit erstellt werden, d.h. im Programm muss ein neues Objekt mit den gleichen Daten erzeugt werden.

Vergleiche

Bei einem Vergleich von Wertetypen und Referenztypen wird grundsätzlich das verglichen, was sich auf dem Stack befindet. Handelt es sich bei dieser Variablen um einen Wertetyp, so wird auch der enthaltene Wert verglichen. Zwei Wertetypen werden also dann als gleich angesehen, wenn sie die gleichen Daten enthalten. Im Falle von Referenztypen steht im Stack lediglich die Referenz. Zwei Referenztypen sind demnach dann als gleich anzusehen, wenn sie auf die gleiche Speicherstelle im Heap verweisen.

Der Wert null
Die Deklaration einer Variablen bedeutet noch nicht, dass diese auch einen Wert besitzt. Im Falle von Wertetypen ist in diesem Fall wirklich kein Wert vorhanden, der Compiler verweigert in diesem Fall dann die Arbeit, wenn die Möglichkeit besteht, dass die Variable vor ihrer ersten Verwendung nicht initialisiert ist.

Kategorien

Service

Info/Kontakt