Know-how Datentypen in .NET Datentypen in .NET Christoph Spielmann, Düsseldorf Wie es sich für eine vernünftige Programmiersprache gehört, stellt auch VB.NET eine Reihe von Datentypen zur Verfügung, die Sie in Ihrem Programmcode verwenden können. Dieser Artikel gibt Ihnen einen Überblick über die wichtigsten Datentypen und erläutert Besonderheiten, die Sie unbedingt berücksichtigen sollten. 1 Der passende Datentyp Programmiersprachen stellen in der Regel einen kompletten Satz an Datentypen zur Verfügung. Jeder Datentype hat hierbei bestimmte Fähigkeiten und belegt eine bestimmte Menge an Speicherplatz. Zu einem guten Programmierstil gehört es, einen Datentyp auszuwählen, der bei minimalem Speicherplatzbedarf die gewünschte Anforderung erfüllen kann. Wenn Sie also beispielsweise das Alter einer Person speichern möchten, ist der Datentyp Byte (= 8 Bit) in der Regel ausreichend. Er unterstützt Werte im Bereich von 0 bis 255. Jedoch gibt es eine wichtige Ausnahme von dieser Regel: Heutzutage sind die meisten Prozessoren als 32-bit-Prozessoren ausgelegt. Dies führt dazu, dass sie mit aus 32 Bit bestehenden Zahlen schneller rechnen können, als mit kleineren oder größeren Zahlen. In der Praxis wird daher auch für Zahlen mit kleinen Wertebereichen häufig der Datentyp Integer eingesetzt. Inhalt 1 2 3 4 5 6 Priorität hat (weil Sie beispielsweise sehr viele Werte in einem Array ablegen möchten), sollten Sie einen möglichst Speicherplatzsparenden Type auswählen. Insgesamt unterstützt VB.NET die numerischen Datentypen aus Tab. 1. Typ Speicherplatz (Bits) Byte 8 Short 16 Integer 32 Single 32 Long 64 Double 64 Decimal 128 Tab. 1: Numerische Datentypen unter .NET Die ersten 5 Datentypen können nun ganzzahlige Werte aufnehmen. Die letzten beiden Datentypen Double und Decimal unterstützten dagegen auch Dezimalbruchzahlen. 2 Der Wertebereich entspricht dem eines LongAutoWert-Feldes von Access und ist damit sehr groß. Außerdem werden sowohl negative als auch positive Ganzzahlen unterstützt. Wenn Sie also auf eine gute Performance Ihrer Anwendung Wert legen, sollten Sie für Ganzzahlen den Datentyp Integer verwenden. Wenn dagegen ein möglichst geringer Speicherbedarf computer.haufe.de Der passende Datentyp ................................... 1 Deklaration einer Variablen ........................... 1 Boxing................................................................... 2 Nicht numerische Datentypen...................... 3 Typkonvertierung .............................................. 5 Zusammenfassung und Ausblick.................. 5 Deklaration einer Variablen Die Deklaration einer Variablen erfolgt in VB.NET auf die gleiche Weise, wie in VBA unter Access mit Hilfe der Dim-Anweisung. Das folgende Beispiel definiert eine neue Variable mit dem Typ Integer und weist dieser einen Wert zu: Dim Alter As Integer Alter = 23 Access, SQL & .NET PREVIEW 1 Know-how Datentypen in .NET Wenn Sie die Anwendung nun mit der Taste F5 starten, wird das Alter in einem Konsolenfenster ausgegeben. Imports System Module Main Sub Main() Dim Alter As Integer Die Deklaration einer Variablen mit dem Datentyp Double erfolgt auf die gleiche Weise. Bei der Zuweisung eines Wertes müssen Sie darauf achten, dass Sie als Dezimaltrennzeichen den Punkt verwenden (s. Abb. 1): Alter = 23 Console.WriteLine (Alter) End Sub End Module Quellcode 1 Um dieses Beispiel in SharpDevelop nachzuvollziehen, gehen Sie wie folgt vor: Dim Wechselkurs As Double Wechselkurs = 1.2333 step by step Praxis-Tipp Falls noch nicht geschehen, installieren Sie SharpDevelop und das .NET-Framework nach der Beschreibung im Artikel .NET-Programmierung mit SharpDevelop. Wenn Sie einer Variablen des Typs Double eine Ganzzahl zuweisen möchten, sollten Sie dies im Programmcode immer inklusive „.0“ angeben (beispielsweise 4.0). Dies verbessert die Lesbarkeit. 1 2 3 Starten Sie SharpDevelop. 3 Wählen Sie den Menüpunkt tei → Neu → Combine aus. 4 Klicken Sie auf die Kategorie VBNET und die Schablone Konsolenanwendung. 5 Geben Sie unter Name den Projektnamen Datentypen ein. 6 7 Boxing Da- Bestätigen Sie mit Erstellen. Ergänzen Sie die Sub Main wie in Quellcode 1. Bei der Entwicklung von .NET war es das Ziel, alles als Objekt zu behandeln. Dies sollte auch auf einfache Variablen (Value Types) des Typs Integer oder Double zutreffen. Das Problem bei Objekten ist, dass diese in einem speziellen Speicherbereich abgelegt werden (Heap), was viel Zeit in Anspruch nimmt und damit die Performance der Anwendung verschlechtert. Die Lösung besteht darin, dass .NET eine Value-Type-Variable bei Bedarf in ein einfaches Objekt umwandelt. Dieser Vorgang wird auch als „Boxing“ bezeichnet. Das folgende Beispiel demonstriert dies: Sub Main() Console.WriteLine _ ((3.4).ToString()) End Sub Abb. 1: Die Testprozedur in SharpDevelop 2 Access, SQL & .NET PREVIEW Hier wird die Zahl 3,4 mit Hilfe der ToString-Methode in einen Text umgewandelt und schließlich ausgegeben. Die Klammern um die Zahl herum sind nur erforderlich, damit .NET den Dezimalpunkt von dem übli- computer.haufe.de Know-how Datentypen in .NET chen Punkt zum Verweis auf Methoden unterscheiden kann. Bei der Ausführung der Anweisung liest .NET die Zahl in ein temporäres Objekt ein, so dass es die ToString-Methode ausführen kann. Wird das Objekt danach nicht mehr benötigt, zerstört es .NET automatisch. Von dem kompletten Vorgang bekommen Sie als Programmierer nichts mit. durch den zur Verfügung stehenden Speicherplatz beschränkt. Wenn Sie also beispielsweise den Inhalt eines Access-Memo-Feldes in .NET weiterverarbeiten möchten, ist der StringDatentyp hierfür ideal geeignet. Es folgt ein Beispiel, in dem eine entsprechende Variable deklariert und ein Text zugewiesen wird: Dim Nachname As String 4 Nicht numerische Datentypen Neben den bereits vorgestellten numerischen Datentypen unterstützt VB.NET noch die folgenden Typen: Nachname = "Müller" Um zu prüfen, ob eine String-Variable einen Inhalt hat, können Sie eine der folgenden Varianten verwenden: Sub Main() Typ Verwendungszweck Boolean True/False Nachname = "" String Zeichenketten If Nachname = "" Then Char Ein einzelnes Zeichen DateTime Datums- und Zeitangaben Object Ein beliebiges Objekt Dim Nachname As String Console.WriteLine("Leer") End If If Nachname.Length = 0 Then Console.WriteLine("Leer") End If Tab. 2: Nicht numerische Datentypen If Nachname = String.Empty Then In den folgenden Abschnitten werden die Einsatzzwecke kurz beschrieben. End If Console.WriteLine("Leer") 4.1 Boolean Der Datentyp Boolean dient zum speichern von zwei Zuständen, nämlich True oder False. Das folgende Beispiel deklariert eine BooleanVariable und weist dieser den Wert True zu: End Sub In einigen Fällen kann eine String-Variable nicht nur leer sein, sondern auf überhaupt kein Objekt verweisen. Dies kann mit dem folgenden Ausdruck geprüft werden: If Nachname Is Nothing Then Console.WriteLine("Leer") Dim IstAngestellt As Boolean End If IstAngestellt = True Anders als bei Access beziehungsweise VBA basieren True und False nicht mehr durch numerische Werte. Die folgende Anweisung würde daher bei VBA funktionieren, bei .NET jedoch zu einem Kompilierfehler führen: Da VB.NET einer neuen String-Variable schon bei der Deklaration einen Leerstring zuweist, sollte der Zustand Nothing in der Regel nicht auftreten. Einige Klassen des .NET-Frameworks verhalten sich hier jedoch anders, so dass eine entsprechende Prüfung erforderlich ist. IstAngestellt = -1 4.3 Char 4.2 String Der Char-Datentyp hat die Aufgabe, ein einzelnes Zeichen zu speichern. Das folgende Beispiel zerlegt einen String in einzelne Zeichen und gibt diese in der Konsole aus (s. Abb. 2): Der Datentyp String unterstützt das Speichern von Texten. Die Länge des Textes ist hierbei nur computer.haufe.de Access, SQL & .NET PREVIEW 3 Know-how Datentypen in .NET Sub Main() Dim Nachname As String Ausdruck gibt beispielsweise nur das Datum, ohne Uhrzeit aus: Dim Zeichen As Char Nachname = "Müller" Console.WriteLine (Geburtsda- For Each Zeichen In Nachname tum.ToString("d")) Console.WriteLine(Zeichen) Next End Sub Abb. 2: Die Zerlegung einer Zeichenkette 4.4 DateTime Das „d“ steht hierbei für ein vordefiniertes Standardformat, ähnlich wie Sie es zum Beispiel von Access her kennen. In der Dokumentation zum .NET-Framework finde Sie noch weitere Formate für die verschiedensten Einsatzzwecke. Natürlich stellt das .NET-Framework zum Rechnen mit Datumswerten eine Reihe von Funktionen in Form von Objektmethoden zur Verfügung. Das folgende Beispiel addiert zu dem angegebenen Datum 6 Monate und gibt das Ergebnis aus: Sub Main() Dim Geburtsdatum As DateTime Der DateTime-Datentyp unterstützt das Speichern von Datums- und Zeitangaben. Streng genommen handelt es sich hierbei nicht um einen Value-Type, sondern um eine „normale“ Objektklasse. Das folgende Beispiel definiert eine DateTime-Variable und weist dieser ein festes Datum zu: Geburtsdatum = _ New DateTime(1970, 12, 30) Dim NeuesDatum As DateTime NeuesDatum = _ Geburtsdatum.AddMonths(6) Console.WriteLine _ (NeuesDatum.ToString("d")) End Sub Sub Main() Dim Geburtsdatum As DateTime 4.5 Objekt Geburtsdatum = _ New DateTime(1970,12,30) Console.WriteLine (Geburtsdatum) End Sub Anders als bei Access werden feste Datumswerte im Quellcode nicht in der Form #mm/dd/yyyy# sondern durch Angabe der einzelnen Bestandteile eines Datums definiert. Die Angabe erfolgt hierbei innerhalb des Konstruktors, der bei der Anlage eines neuen Objekts aufgerufen wird. Nach dem Start des Beispiels erscheint in der Konsole das folgende Ergebnis: Der Datentyp Object hat eine besondere Bedeutung. Er ist das Basis-Objekt aller anderen Objekte und kann damit Referenzen auf alle anderen Objekte speichern. Er ist daher mit dem aus VBA bekannten Datentyp Variant vergleichbar, der in .NET nicht mehr verfügbar ist. Das folgende Beispiel speichert ein Datum in einer Variablen des Typs Object: Sub Main() Dim MeinDatum As Object 30.12.1970 00:00:00 MeinDatum = New DateTime(2004, 1, 12) Console.WriteLine _ Die Nullwerte stehen hierbei für eine Uhrzeit. Um die Ausgabe anders zu formatieren, können Sie die ToString-Anweisung einsetzen. Der folgende 4 Access, SQL & .NET PREVIEW (DirectCast(MeinDatum, _ DateTime).ToString("d")) End Sub computer.haufe.de Know-how Datentypen in .NET Die Zuweisung eines Datums zu einer ObjectVariablen funktioniert auf die gewohnte Art und Weise. mit der ToString-Methode kennengelernt. Diese Methode steht grundsätzlich bei allen Objekten zur Verfügung. Um das Datum aber aus der variablen wieder heraus zu bekommen, muss mit Hilfe der DirectCast-Anweisung angegeben werden, welchen Typ der Programmierer in der Variablen erwartet. Der andere Weg, nämlich die Umwandlung eines Textes in eine Zahl tritt häufig bei der Verarbeitung von Benutzereingaben auf. Auf diese Weise kann der Compiler von .NET den Quellcode auf Richtigkeit prüfen, was Fehler vermeidet. Sollte während der Ausführung des Programms nicht der erwartete Typ in der Variablen sein, tritt ein Laufzeitfehler aus, wie das folgende Beispiel zeigt: Zu diesem Zweck stellt .NET die Convert-Klasse zu Verfügung. Das folgende Beispiel wandelt einen Text in eine Zahl um: Sub Main() Dim MeineEingabe As String Console.WriteLine_ ("Bitte geben Sie eine Zahl ein:") Sub Main() MeineEingabe = Console.ReadLine() Dim MeineZahl As Object Dim MeineZahl As Integer MeineZahl = 5 MeineZahl = _ Console.WriteLine _ Convert.ToInt32(MeineEingabe) (DirectCast(MeineZahl, _ Console.WriteLine _ DateTime).ToString()) (MeineZahl.ToString()) End Sub End Sub In diesem Beispiel wird einer Object-Variablen eine Zahl zugewiesen, beim Auslesen jedoch ein Datum erwartet. Dies quittiert .NET durch einen Fehler des Typs InvalidCastException (s. Abb. 3). 5 Hinweis Falls Sie bei der Eingabe einen Text eingeben, der nicht in eine Zahl konvertiert werden kann, meldet .NET einen Laufzeitfehler. Typkonvertierung Eine wichtige Aufgabe bei der Programmierung ist die Umwandlung von einem Typ in einen anderen. Eine Variante, nämlich die von einer Zahl in einen String, haben Sie bereits im Zusammenhang Neben der ToInt-Methode stellt die ConvertKlasse noch eine Vielzahl anderer Methoden zur Verfügung, mit der Sie jeden Value-Type in jeden anderen Value-Type verwandeln können. 6 Zusammenfassung und Ausblick Nach diesem kurzen Überblick über .NET-Datentypen fällt es Ihnen sicherlich leichter, den passenden Datentyp für Ihre Zwecke auszuwählen. Abb. 3: Der von .NET ausgelöste Fehler computer.haufe.de In zukünftigen Artikeln in weiteren Ausgaben von Access im Unternehmen werden wir anhand von Praxisbeispielen noch genauer auf den Umgang mit den verschiedenen Typen eingehen. Access, SQL & .NET PREVIEW 5