Free Trial

Safari Books Online is a digital library providing on-demand subscription access to thousands of learning resources.


  • Create BookmarkCreate Bookmark
  • Create Note or TagCreate Note or Tag
  • DownloadDownload
  • PrintPrint
Share this Page URL
Help

4. Variablen, Datentypen und Operatoren > 4.3 Visual Basic-Datentypen und das g...

4.3 Visual Basic-Datentypen und das gemeinsame Typsystem von .NET Framework

Im ersten Kapitel, in dem Sie einen Überblick über .NET Framework erhalten haben, haben Sie bereits die .NET-Komponente Common Language Infrastructure (CLI) kennengelernt. Ein Bestandteil der CLI ist das sogenannte gemeinsame Typsystem (Common Type System, CTS). Im gemeinsamen Typsystem sind die Datentypen definiert, die .NET Framework zur Verfügung stellt und die in den Programmiersprachen, mit denen Anwendungen für Microsoft .NET Framework erstellt werden können, implementiert sein müssen.

Dies ist ein wichtiger konzeptioneller Unterschied zu anderen Programmiersprachen, wie z.B. C oder Visual Basic 6.0, bei denen die Datentypen Teil der Spezifikation der Programmiersprachen sind. Bei Visual Basic (und allen anderen Programmiersprachen, mit denen Sie .NET-Code erstellen können) sind die Datentypen Teil der Spezifikation von .NET Framework; sie werden lediglich in der Programmiersprache selbst implementiert.

Wenn Sie, wie im Beispiel mit dem kleinen Rechner, eine Variable vom Visual Basic-Typ Integer deklarieren und hierbei das Visual Basic-Schlüsselwort Integer verwenden, dann definieren Sie im Grunde eine Variable des .NET-Datentyps System.Int32. Das Visual Basic-Schlüsselwort Integer ist ein Alias für den Datentyp System.Int32. Daher ist diese Anweisung:

Dim i as Integer

mit der folgenden identisch:

Dim i As System.Int32

Da Visual Basic 2010 Express in die Projekte automatisch den Verweis auf die Bibliothek System einfügt und diesen Namespace importiert (siehe auch Kapitel 3), können Sie auch folgende Kurzschreibweise verwenden:

Int32 i

Tabelle 4.3 führt die Visual Basic-Datentypen und deren Entsprechung aus dem gemeinsamen Typsystem von .NET Framework auf.

Tabelle 4.3 Die Visual Basic-Datentypen und deren .NET Framework-Typen

Visual Basic-Datentyp

.NET Framework-Typ

Boolean

System.Boolean

Byte

System.Byte

SByte

System.SByte

Char

System.Char

Decimal

System.Decimal

Double

System.Double

Single

System.Single

Integer

System.Int32

UInteger

System.UInt32

Long

System.Int64

Object

System.Object

ULong

System.UInt64

Short

System.Int16

UShort

System.UInt16

String

System.String

Da es sich bei .NET Framework und bei Visual Basic 2010 größtenteils um eine objektorientierte, klassenbasierte Ausführungsumgebung bzw. Programmiersprache handelt, sind alle Datentypen selbst eigene Klassen, die alle von der Microsoft-Basisklasse System.Object abgeleitet sind. (Mehr über Ableitung, Vererbung und Klassen erfahren Sie etwas später in diesem Buch, wenn wir uns ausführlicher mit der objektorientierten Programmierung beschäftigen. In Kapitel 11 finden Sie eine Grafik, die den Stammbaum der Datentypen von .NET Framework zeigt.) Alle Datentypenklassen besitzen Methoden, die Sie verwenden können, um mehr über die Datentypen zu erfahren.

  1. Erstellen Sie ein neues Projekt des Typs Konsolenanwendung und nennen Sie es Datentypen.

  2. Fügen Sie in die Sub Main-Prozedur den folgenden Quellcode ein und lassen Sie sich beim Tippen von IntelliSense helfen:

    Sub Main()
       Dim i As Integer = 1
       Console.WriteLine("Informationen über die Variable i")
       Console.WriteLine(i.GetType().ToString())
       Console.WriteLine(i.GetType().BaseType.ToString())
       Console.WriteLine(i.GetType().BaseType.BaseType.ToString())
       Console.WriteLine(i.GetType().Assembly.ToString())
       Console.WriteLine()
    
       Dim s As String = "Datentypen"
       Console.WriteLine("Informationen über die Variable s")
       Console.WriteLine(s.GetType().ToString())
       Console.WriteLine(s.GetType().BaseType.ToString())
       Console.WriteLine(s.GetType().Assembly.ToString())
    
       Console.ReadKey()
    End Sub
  3. Starten Sie das Programm, indem Sie den Befehl Debuggen/Debugging starten wählen oder den Shortcut F5 drücken. Sie erhalten die folgende Ausgabe:

Dieses Programm informiert Sie über Eigenschaften der Datentypen Integer und String

Abbildung 4.3 Dieses Programm informiert Sie über Eigenschaften der Datentypen Integer und String

In diesem kleinen Programm wird zuerst eine Variable des Visual Basic-Datentyps Integer und weiter unten eine des Visual Basic-Datentyps String deklariert und initialisiert. Die Variable i ist eine Instanz, ein Vorkommen der Klasse System.Int32; die Variable s ist eine Instanz der Klasse System.String. Der Name der Variablen, gefolgt vom Punkt-Operator, wird anschließend verwendet, um einige der Methoden und Eigenschaften der Klassen aufzurufen und deren Rückgabewerte mit Console.WriteLine auszugeben.

Die Methode GetType ruft den .NET-Systemdatentyp der aktuellen Instanz ab. Für die Variable i ist dies der Typ System.Int32, für die Variable s der Typ System.String. Anschließend wird die Eigenschaft BaseType verwendet, die den Typ abruft, der dem aktuellen Datentyp zugrunde liegt. Für die Variable i ist dies der Typ (die Klasse) ValueType. ValueType wiederum ist von System.Object abgeleitet, dem Basistyp aller Klassen in .NET Framework. Auch für die Variable s wird die Eigenschaft BaseType abgerufen; wir können erkennen, dass System.String direkt von System.Object abgeleitet ist.

Wir kennen nun den »Stammbaum« von System.Int32 (int) und von System.String (string):

  • System.Int32 ist abgeleitet von System.ValueType, dieser Typ ist abgeleitet von System.Object.

  • System.String ist abgeleitet von System.Object.

(Haben Sie noch einen kleinen Moment Geduld, die Unterschiede zwischen ValueType (Werttyp) und ReferenceType (Verweistyp) beschäftigen uns im nächsten Abschnitt.)

Für GetType wird abschließend noch die Eigenschaft Assembly abgerufen, die den Namen und die Versionsinformationen der Assembly zurückgibt, in der der Typ definiert ist.

Werttypen und Verweistypen

Die Datentypen von .NET Framework (und damit auch die Datentypen), die Sie in Visual Basic verwenden können, lassen sich in die Kategorien Werttyp und Verweistyp einteilen. Was genau ist der Unterschied?

In einer Variablen, die ein Werttyp ist, wird der Wert der Variablen direkt in ihr selbst gespeichert. Ein Beispiel hierfür ist der Datentyp int. Die Speichergröße (wie viel Platz eine solche Variable im Arbeitsspeicher des Computers belegt) für Werttypen ist bekannt. Werttypen werden in einem bestimmten Speicherbereich des Computers, der Stack (oder Stapel) genannt wird, abgelegt.

In Variablen von Verweistypen, die auch als Objekte bezeichnet werden, werden Verweise auf die tatsächlichen Daten gespeichert. Die Daten der Objekte oder des Datentyps String werden in einem anderen Speicherbereich gespeichert, dem sogenannten Heap. In einer Variablen eines Verweistyps befindet sich lediglich ein Verweis (also eine Adresse) auf den Speicherbereich im Heap, in dem die eigentlichen Daten liegen. Die Stelle im Arbeitsspeicher, an der sich die eigentliche Zeichenfolge befindet, kann sich ändern, wenn Sie einer String-Variablen eine andere Zeichenfolge zuweisen.

Der Hauptgrund für den Unterschied besteht darin, dass Werttypen auf dem Stack schneller anzulegen und zu verwalten sind und weniger Speicherplatz benötigen als Objekte, die sich immer auf dem Heap befinden.

Die Bedeutung von Nothing bei Verweistypen

Wenn Sie eine Variable eines Verweistyps deklarieren und dabei keine Initialisierung vornehmen, besitzt diese Variable einen besondern Wert: Nothing. Nothing ist ein Schlüsselwort von Visual Basic, das bei Verweistypen einen sogenannten Nullverweis repräsentiert. Sie können sich dies so vorstellen, dass eine Variable eines Verweistyps aus zwei Elementen besteht: zum einen aus dem Namen/der Adresse der Variablen und zum anderen aus dem eigentlichen Inhalt. Wenn Sie folgendermaßen eine String-Variable deklarieren:

Dim meineZeichenkette As String

dann ist nach der Deklaration lediglich bekannt, wo sich die Variable meineZeichenkette befindet, sie hat aber noch keinen »echten« Inhalt; der Inhalt der Variablen ist zu diesem Zeitpunkt lediglich ein Nullverweis. Erst wenn Sie der Variablen einen Wert, also hier eine Zeichenkette, zuweisen, zeigt der Verweis, der in der Variablen gespeichert wird, tatsächlich auf eine Zeichenkette:

zeichenKette = "Der Inhalt der Zeichenkette"

Mit den Vergleichsoperatoren, die Sie in Kapitel 6 ausführlich kennenlernen, können Sie prüfen, ob in einer Variablen eines Verweistyps ein echter Verweis oder ein Nullverweis enthalten ist. Schauen Sie sich einmal folgendes Codefragment an:

' Initialisierung ist erforderlich, da es sonst eine Warnung des Compilers gibt
Dim meineZeichenkette As String = Nothing

' Prüfen, ob in meineZeichenkette ein Nullverweis enthalten ist
If IsNothing(meineZeichenkette) Then
   Console.WriteLine("Meine Zeichenkette enthält einen Nullverweis.")
End If

If meineZeichenkette = Nothing Then
   Console.WriteLine("Meine Zeichenkette enthält einen Nullverweis.")
End If

Sie können das Schlüsselwort Nothing auch in Zuweisungen verwenden, wie hier in der ersten Codezeile gezeigt. String-Variablen enthalten zwar standardmäßig einen Nullverweis, wenn sie nicht initialisiert wurden. Die Zuweisung ist in dem Codefragment dennoch erforderlich, da der Compiler ansonsten streikt, da er merkt, dass wir eine nicht initialisierte Variable verwenden. Die Anweisungen, die mit If beginnen, prüfen, ob sich in meineZeichenkette ein Nullverweis befindet. Diese Vergleichsprüfung wird in der ersten If-Anweisung mit der Funktion IsNothing vorgenommen, die True zurückgibt, wenn der Parameter ein Nullverweis ist; anderenfalls gibt sie False zurück. In der zweiten If-Anweisung wird der Gleichheitsoperator = verwendet. Wenn in meineZeichenkette ein Nullverweis enthalten ist, wird eine entsprechende Meldung ausgegeben.

Ausführliche Informationen zur If-Abfrage und den Vergleichsoperatoren finden Sie in Kapitel 6. Hier ist nur wichtig, dass das Schlüsselwort Nothing sowohl bei einer Zuweisung als auch beim Abfragen des Inhalts einer Verweisvariablen verwendet werden kann.