Jetzt lerne ich Visual Basic.NET GERMAN

136
Visual Basic .NET

Transcript of Jetzt lerne ich Visual Basic.NET GERMAN

Page 1: Jetzt lerne ich Visual Basic.NET  GERMAN

Visual Basic .NET

Page 2: Jetzt lerne ich Visual Basic.NET  GERMAN
Page 3: Jetzt lerne ich Visual Basic.NET  GERMAN

Markt+Technik Verlag

Peter Monadjemi

Jetzt lerne ich

Visual Basic .NET

Page 4: Jetzt lerne ich Visual Basic.NET  GERMAN

Die Deutsche Bibliothek - CIP-EinheitsaufnahmeEin Titeldatensatz für diese Publikation ist bei Der Deutschen Bibliothek erhältlich.

Die Informationen in diesem Produkt werden ohne Rücksicht auf eineneventuellen Patentschutz veröffentlicht.Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt.Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen.Trotzdem können Fehler nicht vollständig ausgeschlossen werden.Verlag, Herausgeber und Autoren können für fehlerhafte Angabenund deren Folgen weder eine juristische Verantwortung nochirgendeine Haftung übernehmen.Für Verbesserungsvorschläge und Hinweise auf Fehler sind Verlag undHerausgeber dankbar.

Alle Rechte vorbehalten, auch die der fotomechanischenWiedergabe und der Speicherung in elektronischen Medien. Die gewerbliche Nutzung der in diesem Produkt gezeigtenModelle und Arbeiten ist nicht zulässig.

Fast alle Hardware- und Software-Bezeichnungen, die in diesem Bucherwähnt werden, sind gleichzeitig auch eingetragene Warenzeichenoder sollten als solche betrachtet werden.

Umwelthinweis:Dieses Buch wurde auf chlorfrei gebleichtem Papier gedruckt.Die Einschrumpffolie - zum Schutz vor Verschmutzung - ist ausumweltverträglichem und recyclingfähigem PE-Material.

10 9 8 7 6 5 4 3 2 1

05 04 03 02

ISBN 3-8272-6267-4

© 2002 by Markt+Technik Verlag,ein Imprint der Pearson Education Deutschland GmbH,Martin-Kollar-Straße 10–12, D-81829 München/GermanyAlle Rechte vorbehaltenLektorat: Erik Franz, [email protected]: Petra Kienle, FürstenfeldbruckHerstellung: Claudia Bäurle, [email protected]: Gregor Kopietz, [email protected]: Nowak werbeagentur & medien, PfaffenhofenSatz: text&form GbR, FürstenfeldbruckDruck und Verarbeitung: Media Print, PaderbornPrinted in Germany

Page 5: Jetzt lerne ich Visual Basic.NET  GERMAN

5

Übersicht

Einleitung 171 Das erste Visual Basic .NET-Beispiel 312 Die .NET-Philosophie 473 Visual Basic .NET-Einmaleins 834 Kontrollstrukturen 1135 Funktionen und Prozeduren 1376 Klassen 1477 Zeichenketten (Strings) 1738 Arrays (Felder) 1979 Dateizugriffe und Ausnahmen 22710 Fortgeschrittenere Programmelemente in

Visual Basic .NET 25911 OOP für (etwas) Fortgeschrittene 29712 XML, was sonst? 33513 Visual Basic .NET und das Internet 36714 Windows Forms, Controls und Visual Studio .NET 387Anhang A: .NET von A bis Z 413Anhang B: Visual Basic .NET-Referenz 417Anhang C: Überblick über das .NET-Framework-SDK 427Anhang D: Antworten 433Stichwortverzeichnis 473

Page 6: Jetzt lerne ich Visual Basic.NET  GERMAN
Page 7: Jetzt lerne ich Visual Basic.NET  GERMAN

7

Inhaltsverzeichnis

Einleitung 17

1 Das erste Visual Basic .NET-Beispiel 31

1.1 Auch .NET kann Hallo sagen 311.2 Der allgemeine Aufbau einer Konsolenanwendung 341.2.1 Der allgemeine Programmrahmen einer Konsolenanwendung 351.3 Ein paar Spezialitäten in .NET 361.3.1 Dateizugriffe in Visual Basic .NET 361.3.2 XML-Dateien lesen und auswerten 371.3.3 Herunterladen einer HTML-Datei von einem Webserver 391.3.4 Zugriff auf die Metadaten eines Assembly 401.3.5 Aufruf einer Windows-API-Funktion 421.4 Die wichtigsten Compiler-Optionen 431.5 Zusammenfassung 451.6 F&A 46

2 Die .NET-Philosophie 47

2.1 Was ist .NET? 492.1.1 Die Rolle der Common Language Runtime (CLR) 502.1.2 IL als die neue Maschinensprache 522.2 .NET im Gesamtüberblick 542.3 Die Datentypen des Common Type System (CTS) 562.4 Die .NET-Basisklassen 58

Page 8: Jetzt lerne ich Visual Basic.NET  GERMAN

8

Inhaltsverzeichnis

2.4.1 Die Rolle der Namensräume 582.4.2 Die .NET-Basisklassen in der Praxis 602.5 Die Rolle der Assemblies 622.5.1 Starke Namen, schwache Namen 652.6 Vorteile für Programmierer 692.6.1 Versionierung 702.6.2 Sicherheit 712.6.3 Vereinfachung durch Laufzeitdienste 722.6.4 Vereinheitlichung 722.6.5 Leistungsfähigere Programmiersprachen 722.6.6 Durch und durch objektorientiert 732.6.7 Zusammenarbeit zwischen Programmen 732.6.8 Realisierung verteilter Anwendungen 762.6.9 Mehr Spaß 762.7 Weitere Bestandteile von .NET 772.7.1 C# und Visual Basic .NET 772.7.2 ASP .NET 782.7.3 Webdienste 782.7.4 ADO .NET 792.7.5 Windows Forms 792.8 Die Common Language Infrastructure (CLI) für Linux & Co. 792.9 Zusammenfassung 802.10 F&A 81

3 Visual Basic .NET-Einmaleins 83

3.1 Kleine Merkzettel für das Programm: die Variablen 843.1.1 Variablen mit einem Anfangswert belegen 843.1.2 Mehrere Variablen in einem Befehl deklarieren 843.1.3 Mehrere Variablen mit unterschiedlichen Datentypen in

einem Befehl deklarieren 843.1.4 Weitere Deklarationsbefehle 853.2 Die Merkmale einer Variablen 853.2.1 Formal und trotzdem unverzichtbar: der Datentyp 853.2.2 Typisch Basic – der Datentyp ist freiwillig 883.2.3 Die Rolle des Gültigkeitsbereichs:

Wo werden Variablen in einem Programm deklariert? 893.2.4 Die Rolle der Lebensdauer einer Variablen 923.3 Charakterfest und beständig: die Konstanten 933.3.1 Auch Zahlenwerte sind Konstanten 943.3.2 Zeichenkettenkonstanten 94

Page 9: Jetzt lerne ich Visual Basic.NET  GERMAN

9

Inhaltsverzeichnis

3.4 Regeln für Bezeichner 953.5 Spezialisten fürs Rechnen: die Operatoren 953.5.1 Ein kleiner Ausflug in die Mathe-Klasse 963.5.2 Zuweisungen 973.5.3 Alles genau nach Vorschrift: die Operatorreihenfolge 983.5.4 Kombiausdrücke: Zuweisung und Operator in einem 983.6 Wahr oder falsch? – die Welt der logischen Verknüpfungen 993.6.1 Die Und-Verknüpfung mit dem And-Operator 1003.6.2 Die Oder-Verknüpfung mit dem Or-Operator 1013.6.3 Die Exklusiv-Oder-Verknüpfung mit dem XOR-Operator 1013.6.4 Die Negation mit dem Not-Operator 1013.6.5 Die kombinierten logischen Operatoren AndAlso und OrAlso 1013.7 Eingaben von der Tastatur 1033.8 Ausgaben auf dem Bildschirm 1033.8.1 Formatierte Ausgaben 1043.8.2 Ausgaben über die Msgbox-Funktion 1063.8.3 Die InputBox-Funktion zur Eingabe 1073.9 Der allgemeine Aufbau eines Visual Basic .NET-Programms 1073.9.1 Die Rolle der Visual Basic .NET-Module 1083.10 F&A 110

4 Kontrollstrukturen 113

4.1 Das Prinzip der Entscheidungen 1144.2 Wenn etwas so ist, dann tue das – der If-Befehl 1154.2.1 Vergleichsoperatoren 1174.2.2 Bedingungen kombinieren 1174.3 Es gibt immer eine Alternative – der Else-Befehl 1184.4 Der ElseIf-Befehl als Abkürzung 1194.5 Mehrfachentscheidungen mit dem Select Case-Befehl 1214.5.1 Einen Case-Zweig vorzeitig verlassen 1254.6 Wiederholungen mit System – der For Next-Befehl 1254.6.1 Zählschleifen mit For Next 1254.6.2 Wiederholungen mit Abbruchbedingung –

der Do Loop-Befehl 1294.6.3 Eine Alternative, die eigentlich keine ist – der While-Befehl 1304.7 Schleifen mit Notausgang – der Exit-Befehl 1314.8 Wie »schnell« ist Visual Basic .NET? 1334.9 Zusammenfassung 1344.10 F&A 134

Page 10: Jetzt lerne ich Visual Basic.NET  GERMAN

10

Inhaltsverzeichnis

5 Funktionen und Prozeduren 137

5.1 Die Definition von Funktionen und Prozeduren 1385.1.1 Der allgemeine Aufbau einer Funktion 1385.1.2 Der allgemeine Aufbau einer Prozedur 1395.1.3 Die Rolle des Rückgabewerts 1395.2 Parameterübergabe bei Funktionen 1395.2.1 Benennung von Funktionsparametern 1405.2.2 Parameterübergabe als Wert 1415.2.3 Optionale Parameter 1415.2.4 Funktionen mit einer variablen Anzahl an Parametern 1425.3 Die Rolle des Funktionsnamens als lokale Variable 1425.4 Rekursive Funktionen 1435.5 Prozedur mit »Notausgang« 1445.6 Zusammenfassung 1445.7 F&A 145

6 Klassen 147

6.1 Klassen definieren 1486.2 Klassen instanzieren 1496.2.1 Vermeiden Sie späte Bindung 1496.3 Felder, Eigenschaften und Methoden implementieren 1506.3.1 Felder implementieren 1506.3.2 Eigenschaften implementieren 1516.3.3 Methoden implementieren 1546.4 Objekte benutzen 1556.5 Die Bedeutung von Me 1566.6 Objekte zuweisen und vergleichen 1586.6.1 Objekte vergleichen 1596.6.2 Feststellen, ob eine Instanz von einer bestimmten Klasse

abstammt 1606.7 Gemeinsam oder Instanz? 1616.8 Objekt oder Klasse? 1636.9 Die Rolle des Konstruktors 1646.10 Eigenschaften und Methoden überladen 1656.11 Klassen und der allgemeine Programmaufbau 1666.12 Klassen und wozu sie gut sind 1676.13 Die .NET-Basisklassen 1686.13.1 Die Rolle des Imports-Befehl 1706.14 Zusammenfassung 1716.15 F&A 171

Page 11: Jetzt lerne ich Visual Basic.NET  GERMAN

11

Inhaltsverzeichnis

7 Zeichenketten (Strings) 173

7.1 Die Definition einer String-Variablen 1747.2 Überblick über die String-Klasse 1757.3 String-Operationen in der Praxis 1777.3.1 Strings zusammenfügen 1777.3.2 Strings vergleichen 1777.3.3 Einen String in Elemente zerlegen 1797.3.4 Einen String durchsuchen 1807.3.5 Elemente in einem String austauschen 1807.3.6 Elemente zu einem String zusammenfügen 1817.3.7 Elemente aus einem String entfernen 1817.3.8 Elemente aus einem String zurückgegeben 1827.3.9 Feststellen, ob ein String mit einem bestimmten Teilstring

beginnt oder endet 1827.3.10 Strings mit Leerzeichen füllen 1827.3.11 Strings »zurechtschneiden« 1827.3.12 Die Länge einer Zeichenkette feststellen 1837.3.13 Strings ohne Wert 1837.3.14 Ein Beispiel für die wichtigsten String-Operationen 1847.4 Die StringBuilder-Klasse für den effektiven Umgang

mit Strings 1897.5 Spezialitäten beim Umgang mit der String-Klasse 1907.5.1 Strings anlegen einmal ganz anders 1917.5.2 Noch einmal Strings zusammensetzen 1927.5.3 Wie passt das alles zusammen? 1927.5.4 Weitere Fakten über Strings bei .NET 1937.6 Zusammenfassung 1937.7 F&A 194

8 Arrays (Felder) 197

8.1 Einer für viele – Feldvariablen stellen sich vor 1988.1.1 Feldvariablen mit ihrer Deklaration initialisieren 1998.1.2 Wachsen oder Schrumpfen kein Problem –

der ReDim-Befehl 2008.1.3 Bitte nichts anfassen – das Schlüsselwort Preserve 2008.1.4 Feststellen der Anzahl der Elemente 2018.1.5 Feststellen der Obergrenze eines Feldes 2028.2 Die nächste Dimension – mehrdimensionale Felder 2028.3 Die Array-Klasse stellt sich vor 2128.3.1 Instanzenmethoden und Eigenschaften der Array-Klasse 215

Page 12: Jetzt lerne ich Visual Basic.NET  GERMAN

12

Inhaltsverzeichnis

8.4 Spezialitäten beim Umgang mit Arrays 2158.4.1 Die Suche in einem Array 2168.4.2 Arrays gegenseitig zuweisen 2178.4.3 Felder löschen 2188.4.4 Arrays nach anderen Kriterien sortieren 2188.4.5 Arrays als Rückgabewerte von Funktionen 2198.4.6 Arrays mit einer anderen Untergrenze als 0 2208.5 In den »Tiefen« der Basisklassen – die ArrayList-Klasse

als Spezialist mit mehr Möglichkeiten 2218.6 F&A 224

9 Dateizugriffe und Ausnahmen 227

9.1 Ein erstes Beispiel für einen Dateizugriff 2289.1.1 Das Prinzip der Arbeitsteilung 2309.2 Die Rolle der Streams 2329.2.1 Die IO.Stream-Klasse 2329.3 Textdateien schreiben und lesen 2339.3.1 Die FileStream-Klasse 2349.3.2 Die StreamReader-Klasse 2349.3.3 Die StreamWriter-Klasse 2349.4 Text oder binär – wo liegt der Unterschied? 2359.5 Überblick über den System.IO-Namensraum 2379.6 Zugriffe auf das Dateisystem 2389.7 Arrays in einer Datei speichern und wieder auslesen 2409.7.1 Sind Sie noch bei mir? – Kurze Pause zum Ausruhen und

Reflektieren 2419.8 Ausnahmen und wie sie abgefangen werden 2439.8.1 Ausnahmen abfangen 2459.8.2 Der Try Catch-Befehl 2479.8.3 Informationen über eine Ausnahme erhalten 2479.8.4 Die Rolle der SystemException-Klasse 2509.8.5 Ein allgemeiner Rahmen für eine Ausnahmebehandlung 2519.8.6 Erweiterung mit dem When-Schlüsselwort 2529.8.7 Gemeinsamer Ausgang für die Ausnahmebehandlung 2529.8.8 Ausnahmebehandlung bei verschachtelten Prozeduren 2539.8.9 Ausnahmen gezielt auslösen 2559.9 Zusammenfassung 2559.10 F&A 256

Page 13: Jetzt lerne ich Visual Basic.NET  GERMAN

13

Inhaltsverzeichnis

10 Fortgeschrittenere Programmelemente in Visual Basic .NET 259

10.1 Klein und praktisch: der With-Befehl 26010.2 Der Gültigkeitsbereich von Variablen 26110.2.1 Variablen in einem Befehlsblock 26110.2.2 Variablen in einer Funktion (oder Prozedur) 26210.2.3 Variablen in einer Klasse – privat, öffentlich oder was? 26210.2.4 Variablen in einem Assembly 26410.2.5 Nur für Freunde – die Deklaration mit Friends 26510.3 Typenkonvertierungen 26610.3.1 Option Strict On 26610.3.2 Die CType-Funktion 26710.3.3 Ein Wort zur Konvertierung von Datumsangaben 26810.3.4 Die »vielen« C<Type>-Funktionen 26810.3.5 Direkter Zugriff auf einen Typ – die GetType-Methode 26910.4 Zufallszahlen 27010.5 Sprünge im Programm – der GoTo-Befehl 27110.6 Sammeln für einen guten Zweck – die Collection-Klassen 27210.6.1 Die NameValueCollection-Klasse im Namensraum

System.Collections.Specialized 27410.6.2 Die HashTable-Klasse – ein Klassiker im modernen Gewand 27610.6.3 Die CollectionBase-Klasse – ohne Vererbung geht es nicht 27910.7 Spezialist für Auflistungen – die For Each-Schleife 28210.8 Zugriff auf die Kommandozeilenargumente 28410.8.1 Spezialität der Konsolenanwendungen 28510.9 Die Environment-Klasse 28510.10 Systeminformationen abfragen 28610.10.1 Der Zugriff auf die Registry 28710.10.2 Der Aufruf von API-Funktionen 28810.11 Was sind eigentlich (noch einmal) Namensräume? 29010.11.1 Der Imports-Befehl 29110.11.2 Eigene Namensräume definieren 29310.12 F&A 295

11 OOP für (etwas) Fortgeschrittene 297

11.1 Die Basisklasse als Vorbild: Vererbung 29811.1.1 Vererbung Schritt für Schritt kennen lernen 29811.1.2 Noch einmal das Protected-Schlüsselwort 30111.1.3 Mehrfache Verberbung kein Problem 30111.1.4 Die abgeleitete Klasse erweitern 302

Page 14: Jetzt lerne ich Visual Basic.NET  GERMAN

14

Inhaltsverzeichnis

11.1.5 Überschreiben von Mitgliedern 30311.1.6 Die Rolle von MyBase 30411.1.7 Der Konstruktor der Basisklasse 30511.1.8 Polymorphie (garantiert ungefährlich) 30711.1.9 Gründe für Vererbung 30911.2 Spezialitäten beim Umgang mit Klassen 31011.2.1 Klassen vor Vererbung schützen 31011.2.2 Schützen von Mitgliedern 31011.2.3 Verdecken von Variablen mit Shadows 31111.2.4 Festlegen einer Standardeigenschaft 31211.3 Abstrakte Basisklassen 31311.3.1 Abstrakt oder virtuell? 31611.4 Völlig unspektakulär: Ereignisse und Delegates 31611.4.1 Ein Delegate stellt sich vor 31611.4.2 Der Delegate-Befehl 31711.4.3 Ein Delegate-Objekt deklarieren 31711.4.4 Und nun zu den Ereignissen 31911.4.5 Ein Ereignis über ein Delegate-Objekt definieren 32011.4.6 Ein Ereignis definieren 32011.4.7 Ein Ereignis auslösen 32011.4.8 Eine Ereignisprozedur definieren 32111.4.9 Der AddHandler-Befehl 32211.4.10 Ein Wort zu MultiCast-Delegates 32211.5 Schnittstellen 32311.5.1 Schnittstellen definieren 32411.5.2 Schnittstellen in den .NET-Basisklassen 32711.5.3 Spezialitäten beim Umgang mit Schnittstellen 32911.5.4 Mehrere Schnittstellen implementieren 32911.5.5 Feststellen, ob eine Klasse eine Schnittstelle unterstützt 33011.5.6 Die Vorteile von Schnittstellen 33011.6 Zusammenfassung 33111.7 F&A 332

12 XML, was sonst? 335

12.1 XML für »Dummies« 33612.1.1 Wohl geformte XML-Dokumente 33912.2 Von Knoten und Kindern 34012.2.1 Die Rolle der Attribute 34212.2.2 XML-Dokumente sind in Wirklichkeit Bäume 34312.2.3 Schemadateien geben XML-Dokumenten eine Struktur 345

Page 15: Jetzt lerne ich Visual Basic.NET  GERMAN

15

Inhaltsverzeichnis

12.3 Beispiele mit XML 34712.3.1 Ein erstes Beispiel mit XML 34712.3.2 XML-Dateien lesen 34912.3.3 Der Zugriff auf Attribute 35012.3.4 Die XMLReader-Klasse 35112.3.5 Spezialitäten mit XPath 35312.3.6 XML-Dateien schreiben 35512.3.7 Objekte speichern durch XML-Serialisierung 35812.4 Wann ist XML wichtig und wann nicht? 36112.5 Ein kurzer Ausblick auf die XML-Webservices 36212.6 Zusammenfassung 36412.7 F&A 364

13 Visual Basic .NET und das Internet 367

13.1 Internet für »Dummies« 36813.1.1 Internet = Client + Server 37013.2 Netzwerkverbindungen über Sockets 37213.3 Kurzer Überblick über den System.Net-Namensraum 37813.4 Der Download einer HTML-Datei 37913.5 Und nun alles mit XML 38113.6 Zusammenfassung 38413.7 F&A 384

14 Windows Forms, Controls und Visual Studio .NET 387

14.1 Windows Forms und Controls 38814.2 Visual Studio .NET stellt sich vor 39214.2.1 Die IDE im Schnelldurchgang 39314.2.2 Anlegen von Projekten 39914.2.3 Projekteigenschaften 40014.2.4 Bestandteile eines Projekts 40114.2.5 Dateierweiterungen 40214.2.6 Debug oder Release? 40214.3 Windows-Anwendungen 40314.3.1 Windows Forms und Controls im Programm ansprechen 40314.3.2 Der Zugriff auf einzelne Windows Forms und Controls 40514.3.3 Eine Windows-Anwendung Schritt für Schritt 40614.3.4 Wenn Fehler auftreten – die Aufgabenliste 40914.4 Zusammenfassung 40914.5 F&A 41014.6 Schlusswort und Ausblick 411

Page 16: Jetzt lerne ich Visual Basic.NET  GERMAN

16

Inhaltsverzeichnis

A .NET von A bis Z 413

B Visual Basic .NET-Referenz 417

B.1 Visual Basic .NET-Befehle 417B.2 Visual Basic 6.0-Befehle, die nicht mehr unterstützt werden 420B.3 Visual Basic .NET-Schlüsselwörter 421B.4 Visual Basic .NET-Operatoren 424B.5 Die Visual Basic .NET-Datentypen 425

C Überblick über das .NET-Framework-SDK 427

C.1 Allgemeines zum .NET-Framework-SDK 427C.2 Die Installation 429C.3 Die Laufzeitumgebung 430C.4 Ein Wort zum Editor 431

D Antworten 433

Stichwortverzeichnis 473

Page 17: Jetzt lerne ich Visual Basic.NET  GERMAN

17

Einleitung

Der 13. Februar 2002 markiert für Windows-Programmierer in der ganzenWelt ein wichtiges Datum. An diesem Tag wurde nach mehrjähriger Entwick-lungsarbeit unter dem Namen Visual Studio .NET die neueste Version desEntwicklungswerkzeugs Visual Studio offiziell ausgeliefert, zu dem auch derNachfolger von Visual Basic 6.0 gehört. Der Namenszusatz .NET (ausgespro-chen wie »dotnet«) geschah nicht ohne Grund und ist keinesfalls lediglich eineweitere Variante der bekannten »Spielchen«, die Microsoft bei der Namensge-bung ihrer Produkte gerne treibt. .NET ist der Name einer komplett neuenEntwicklungsplattform, auf der künftig alle Programmierer ihre Programmeschreiben sollen. .NET bietet viele wichtige Neuerungen und konkrete Verbes-serungen für praktisch alle Programmierer (die in Kapitel 2 hoffentlich leichtverständlich zusammengefasst werden). .NET soll ein wichtiges Defizit der bis-herigen Programmierplattform COM beheben. Es soll sehr viel einfacher wer-den, Anwendungen für das Internet zu programmieren. Insbesondere vonden Web Services verspricht sich Microsoft eine ganze Menge. Sie könntendie Grundbausteine eines Internets sein, bei dem Dienstleistungen jeglicherArt im Vordergrund stehen, die über Web Services abgewickelt werden.Microsoft will für diese nicht nur die erforderliche Infrastruktur zur Verfügungstellen, sondern auch an jeder Transaktion verdienen. Doch das Internet unddie Web Services sind nur ein Aspekt bei .NET. Auch wer mit Internetpro-grammierung nichts am Hut hat, wird durch .NET viele wichtige Verbesserun-gen erhalten. Da wäre zum einen Visual Studio .NET, ein umfangreiches Ent-wicklungswerkzeug, das erstmalig alle Microsoft-Programmiersprachen untereinen Hut bringt und eine moderne, leistungsfähige und trotzdem komforta-bel zu bedienende Entwicklungsumgebung darstellt. Da wäre zum andereneine allgemeine Laufzeitumgebung (die Common Language Runtime, kurz

Page 18: Jetzt lerne ich Visual Basic.NET  GERMAN

18

Einleitung

CLR), die allen .NET-Programmiersprachen gleichermaßen zur Verfügungsteht und die allen Programmiersprachen einen einheitlichen Satz an Daten-typen und viele leistungsfähige Features bietet. Der CLR ist es zu verdanken,dass Visual Basic .NET Vererbung, Multithreading und eine strukturierte Aus-nahmebehandlung enthält. Merkmale, die in anderen Programmiersprachen,Java sei hier als prominentestes Beispiel genannt, schon lange selbstverständ-lich waren. Mussten sich Visual-Basic-Programmierer vor Jahren noch be-sorgt fragen, ob Visual Basic das richtige Werkzeug sei und die Zukunft nichtetwa Java gehöre, so gehört dies nun der Vergangenheit an. Visual Basic hateinen gewaltigen Sprung nach vorne gemacht und ist Java nun mindestensebenbürtig, wenn nicht sogar ein wenig überlegen.

Der ganze Fortschritt fordert allerdings auch seinen Preis. Dass der Nachfol-ger von Visual Basic 6.0 nicht die Versionsnummer 7.0 trägt, wie es eigent-lich zu erwarten gewesen wäre, hat einen einfachen Grund. Bei Visual Basic.NET handelt es sich um eine von Grund auf neu entwickelte Programmier-sprache, bei der Microsoft lediglich aus Kompatibilitätsgründen den Befehls-satz weitestgehend beibehalten hat und die vertrauten Funktionen und Kon-stanten über eine Kompatibilitätsklasse zur Verfügung stellt. Visual Basic.NET ist damit eher eine Version 1.0 als eine Version 7.0. Dass das Ergebnisnicht 100% kompatibel zum Vorgänger ist, ist bei diesem Hintergrund nichtverwunderlich. Dennoch können alle Visual-Basic-Programmierer mit demErgebnis mehr als zufrieden sein. Niemand wird gezwungen, seine Program-me umzustellen, denn Visual Basic 6.0 und Visual Basic .NET werden in denkommenden Jahren parallel existieren (wenngleich es für Visual Basic 6.0 kei-ne Updates mehr geben wird). Die Zukunft gehört .NET und das ist gut so,denn es ist eine moderne Programmierplattform, die für künftige Aufgaben,ob sie etwas mit dem Internet zu tun haben oder nicht, bestens gerüstet ist.

An wen richtet sich dieses Buch?

Visual Basic .NET ist sehr viel mehr als eine Weiterentwicklung, es ist einevollständige Neuentwicklung, die eigentlich den Namen »Visual Basic .NET1.0« tragen müsste. Dieser Umstand hat auch für dieses Buch eine wichtigeKonsequenz. Es geht nicht um eine Einführung in »Visual Basic 7.0«, sondernum eine Einführung in Visual Basic .NET 1.0. Dies ist weniger eine nettesprachliche Spielerei, sondern drückt einen fundamentalen Wandel in derWelt der Microsoft-Programmiersprachen aus. Im Vordergrund steht der auf.NET basierende Programmierstil, ohne dabei auf etwaige Kompatibilitätsfra-gen Rücksicht zu nehmen. So lassen sich Laufzeitfehler (bei .NET heißen sieoffiziell Ausnahmen) wie seit Visual Basic 1.0 prima über den Befehl On Er-ror Goto abfangen, Zufallszahlen über die Rnd-Funktion erzeugen und Datei-zugriffe über die allen Basic-Programmierern vertrauten Befehle (die bei Visu-al Basic .NET aber Methoden der Kompatibilitätsklasse sind) Open, Print,Input und Close erledigen. Dieser »Kompatibilitätsmodus« spielt für dieses

Page 19: Jetzt lerne ich Visual Basic.NET  GERMAN

19

Einleitung

Buch aber keine Rolle. Sie lernen vielmehr die neue Programmiersprache Vi-sual Basic .NET kennen. Vorkenntnisse in Visual Basic sind daher nicht un-bedingt von Vorteil. Im Gegenteil, für erfahrene Visual-Basic-Programmierergilt der (zugegeben etwas radikale) Ratschlag: »Vergessen Sie alles, was Siebislang über Visual Basic wussten«. Dass heißt nicht, dass bei Visual Basic.NET alles anders ist und elementare Programmierregeln auf den Kopf ge-stellt werden. Das ist mit Sicherheit nicht der Fall. Es bedeutet lediglich, dassbei .NET die Programmiersprache allenfalls sekundär ist, da das .NET-Frame-work im Vordergrund steht. Scheinbar vertraute Sprachelemente dürfen nichtdarüber hinwegtäuschen, dass unter der Haube nach anderen Regeln gespieltwird. Um diese Regeln möglichst schnell zu erlernen, ist es ratsam, die ver-trauten Regeln (zumindestens vorübergehend) auszublenden.

Dieses Buch ist daher auch kein reines Programmieranfängerbuch. Auchwenn offiziell keine Vorkenntnisse vorausgesetzt werden (auch keine Kennt-nisse über frühere Visual-Basic-Versionen), ist eine gewisse Vertrautheit beimUmgang mit einer Programmiersprache und mit dem Prinzip, nach dem ausdem Programmtext (Quelltext) eine ausführbare Programmdatei wird, mit Si-cherheit von Vorteil. Um es einmal etwas salopp zu formulieren, das Buchfängt nicht bei Adam und Eva an.

Was lesen Sie in diesem Buch?

In diesem Buch geht es um eine grundlegende und vor allem leicht verständ-liche Einführung in Visual Basic .NET mit vielen kleinen Beispielen. Da VisualBasic .NET, anders als C, C++, Java und sicherlich auch C# (die neue Pro-grammiersprache von Microsoft, die unter der Federführung von Anders He-jlsberg, dem Vater der Programmiersprachen Turbo Pascal und Delphi ent-wickelt wurde) keine Programmiersprache ist, die im akademischen Bereichgelehrt wird, sondern praktisch ausschließlich praxisorientiert genutzt wird,beschränkt sich das Buch nicht nur auf eine Aneinanderreihung der wichtigs-ten Befehle, es geht vor allem um das Zusammenspiel mit .NET.

1: Ein erstes Beispiel in .NET

Kapitel 1 verschafft allen Leserinnen und Lesern ein erstes Erfolgserlebnis. Sietippen das erste Visual Basic .NET-Programm ein, kompilieren es mit demKommandozeilencompiler und erleben hautnah, dass sich ein »Hallo, Welt«-Programm auch mit Visual Basic .NET programmieren lässt (im Unterschiedzu früheren Versionen besteht es aber ausschließlich aus Klassen und Objek-ten).

2: Die .NET-Philosophie

In Kapitel 2 wird .NET in aller Kürze und mit leicht verständlichen Wortenvorgestellt. Dieses ist keinesfalls ein lästiges Pflichtkapitel, sondern ein wich-

Page 20: Jetzt lerne ich Visual Basic.NET  GERMAN

20

Einleitung

tiger Baustein für das Erlernen von Visual Basic .NET. Außerdem werden hiereine Reihe von Begriffen erklärt, die Sie bestimmt schon öfter gehört haben.

3: Visual Basic .NET-Einmaleins

In Kapitel 3 geht es um alle die Kleinigkeiten, die es bei jeder Programmier-sprache gibt und die überall ein wenig anders gehandhabt werden. Dazu ge-hören Variablen, Deklarationen, Zuweisungen, Operatoren und der allgemei-ne Programmaufbau.

4: Kontrollstrukturen

Zu den Kontrollstrukturen, die in Kapitel 4 an der Reihe sind, gehören Ent-scheidungen und Schleifen. Hier hat es bei Visual Basic .NET im Vergleich zuseinen Vorgängern praktisch keine Änderungen gegeben, so dass dieses Ka-pitel auch sehr überschaubar ist.

5: Funktionen und Prozeduren

Klassen sind die Grundbausteine eines Visual Basic .NET-Programms, Funk-tionen und Prozeduren wiederum die Grundbausteine einer Klasse. In Kapitel5 wird erklärt, wie eine Funktion definiert wird, wie Parameter übergebenwerden und der Datentyp festgelegt wird.

6: Klassen

Klassen sind bei Visual Basic .NET was? Richtig, die Grundbausteine. VisualBasic .NET ist (anders als die Vorgängerversionen) durch und durch objekto-rientiert. Jedes Programm besteht aus mindestens einer Klasse. In Kapitel 6geht es um den Umgang mit Klassen, das Hinzufügen von Feldern, Eigen-schaften und Methoden sowie einige Spezialitäten. Das wichtige (und bei Vi-sual Basic .NET neue) Prinzip der Vererbung ist in Kapitel 11 an der Reihe.

7: Umgang mit Zeichenketten (Strings)

Zeichenketten spielen in praktisch jedem Programm eine Rolle. Bei .NETsind Strings nicht einfach nur ein Datentyp, sie basieren vielmehr auf einer ei-genen Klasse, die in Kapitel 7 vorgestellt wird. Während die Stringverarbei-tung bei früheren Visual-Basic-Versionen noch über viele verschiedene Funk-tionen erledigt wurde, gibt es bei .NET dafür die Methoden der String-Klasse.

8: Arrays (Felder)

Kapitel 8 stellt mit Arrays einen sehr wichtigen Datentyp vor, über den sichmehrere Werte unter einem Namen zusammenfassen lassen. Arrays basierenbei .NET auf der Array-Klasse, die eine Reihe von Methoden zur Verfügungstellt, mit denen sich Arrays bearbeiten lassen (dazu gehört unter anderemeine Sortierfunktion).

Page 21: Jetzt lerne ich Visual Basic.NET  GERMAN

21

Einleitung

9: Dateizugriffe und Ausnahmen

Daten, die ein Programm entgegennimmt, ansammelt und errechnet, sollenim Allgemeinen auch irgendwo dauerhaft gespeichert werden. In Kapitel 9wird gezeigt, wie sich mit Hilfe der .NET-Basisklassen Daten in Dateien spei-chern und wieder aus Dateien auslesen lassen.

10: Fortgeschrittene Programmiertechniken

In Kapitel 10 werden verschiedene »Spezialthemen« vorgestellt, die in den bis-herigen Kapiteln keinen Platz hatten, die aber zum Grundwissen eines VisualBasic .NET-Programmierers gehören.

11: OOP für (etwas) Fortgeschrittene

In Kapitel 6 ging es um das ABC der objektorientierten Programmierung(OOP); in Kapitel 11 sind die etwas fortgeschritteneren Konzepte wie Verer-bung, das damit direkt verbundene Überschreiben von Mitgliedern und derUmgang mit Schnittstellen an der Reihe.

12: XML, was sonst?

XML ist das neue Zauberwort der IT-Branche, das auch bei .NET eine zentra-le Rolle spielt (vor allem in Zusammenhang mit den Web Services, wo es dasallgemeine Datenformat darstellt, mit dem Daten zwischen einem Programmund einem Web Service ausgetauscht werden). Auch wenn es kein direktesGrundlagenthema ist, zeigt Kapitel 12, wie mit Hilfe der .NET-BasisklassenXML-Dateien gelesen und geschrieben werden.

13: Internetprogrammierung mit Visual Basic .NET

Die Internetprogrammierung war einer der Gründe, warum .NET entwickeltwurde. .NET soll die Entwicklung von Internetanwendungen deutlich verein-fachen. Mit Visual Studio .NET wird die Programmierung von Webanwendun-gen (zum Beispiel mit Visual Basic .NET) so einfach wie die Programmierungeiner Windows-Anwendung. In Kapitel 14 geht es allerdings in erster Linieum die Frage, wie sich mit Hilfe der .NET-Basisklassen Dateien aus dem In-ternet herunterladen und einfache Zugriffe über das HTTP-Protokoll durch-führen lassen.

14: Windows Forms, Controls und Visual Studio.NE

Im »grande finale« des Buchs geht es endlich um das, was bei früheren Visual-Basic-Einführungen ganz am Anfang stand: Steuerelemente und Formulare.In diesem Kapitel betritt auch das Entwicklungswerkzeug Visual Studio .NETdie Bühne, das mit C++, C#, J# (die Java-Variante von Microsoft) und VisualBasic .NET gleich vier Programmiersprachen zusammenfasst. Kapitel 14stellt den Umgang mit der IDE vor und geht auf die Programmierung vonWindows-Anwendungen ein.

Page 22: Jetzt lerne ich Visual Basic.NET  GERMAN

22

Einleitung

A: .NET von A bis Z

Mit .NET werden eine Vielzahl neuer Begriffe und Abkürzungen eingeführt,die in Anhang A zusammengefasst werden.

B: Visual Basic .NET-Referenz

Anhang B ist für alle, die es gerne etwas systematischer lieben. Sie finden indiesem Anhang eine komplette Referenz aller Befehle, Schlüsselwörter, Ope-ratoren und Datentypen. Außerdem werden jene Befehle vorgestellt, die esim Vergleich zu Visual Basic 6.0 nicht mehr gibt.

C: Das .NET Framework-SDK im Überblick

Anhang C stellt das .NET Framework-SDK mit seinen verschiedenen Tools,der umfangreichen Dokumentation und den zahlreichen Beispielen vor, dassauch auf der Buch-CD enthalten ist.

D: Antworten

Hier finden Sie alle Antworten und Lösungen zu den Übungen und Quizfra-gen am Ende jedes Kapitels.

E: Der Inhalt der Buch-CD

Anhang E listet den Anhang der Buch-CD auf.

Für alte Bekannte

Erfahrene Visual-Basic-Programmierer werden sich beim Kennenlernen vonVisual Basic .NET aufgrund der vielen Neuerungen und einigen geändertenSpielregeln so manches Mal fragen »Was um aller Welt hat sich Microsoftwohl dabei gedacht?«. Leserinnen und Leser, die bereits das Buch »Jetzt lerneich Visual Basic 6.0« kennen, werden sich unter Umständen eine ähnlicheFrage stellen. Was hat sich der Autor dabei gedacht, wo sind die Fenster ge-blieben, wo die Leichtigkeit und der Spaß beim Programmieren? Alle dieseDinge gibt es natürlich (oder gerade) unter .NET, allerdings stehen sie nichtmehr so stark im Mittelpunkt wie noch bei Visual Basic 6.0. In diesem Buchsteht der neue klassische Weg im Vordergrund. Sie lernen die Programmier-sprache Visual Basic .NET kennen und nicht das Entwicklungswerkzeug Visu-al Studio .NET. Alle neuen Befehle und Funktionen werden in kleine Konso-lenanwendungen eingebaut und nicht in eine typische Windows-Anwendungmit Fenster, Steuerelementen und Menüs. Dieser Ansatz wurde gewählt, weiles sehr wichtig ist, die Sprache Visual Basic .NET losgelöst vom »Rest« zu se-hen. Dann stellt sich nämlich heraus, dass Visual Basic .NET lediglich eine rei-ne Programmiersprache ist, die vollkommen gleichberechtigt mit den übrigen.NET-Programmiersprachen (vor allem C#) existiert. Visual Basic .NET redu-ziert sich dadurch auf einen Satz von Befehlen, Datentypen und Operatoren.

Page 23: Jetzt lerne ich Visual Basic.NET  GERMAN

23

Einleitung

Der ganze Rest wird von .NET zur Verfügung gestellt. Allerdings, und auchdas muss bei der Einführung berücksichtigt werden, war Microsoft bei VisualBasic .NET besonders in der Pflicht, eine möglichst kompatible Umgebungzur Verfügung zu stellen. Aus diesem Grund enthält Visual Basic .NET einige»überflüssige« Elemente, die es in anderen Programmiersprachen nicht gibt.Beispiele sind der allen Visual-Basic-Programmierern bestens bekannte Be-fehl On Error Goto oder der Befehl Module, mit dem Standardmodule defi-niert werden. Diese Befehle sind deswegen überflüssig, weil sie auch mit denneuen Befehlen oder den Möglichkeiten der .NET-Basisklassen implementiertwerden können. Gestandene Visual-Basic-Programmierer können (und sol-len) diese Befehle weiterhin verwenden. Wer mit Visual Basic .NET erst in dieProgrammierung einsteigt, sollte sich mit diesen »Kompatibilitätsbrücken«nicht mehr als unbedingt nötig belasten, da sie ein wenig den Blick auf .NETund seine wirklich vielseitigen Möglichkeiten verstellen können. Aus diesemGrund wird in diesem Buch die »neue Schule« vorgestellt.

Wie einfach ist einfach?

Die Bücher der Serie »Jetzt lerne ich« haben den Anspruch, die Themen, umdie es geht, von Anfang zu erklären, so dass man sie, ohne über spezielle Vor-kenntnisse verfügen zu müssen, nachvollziehen kann. Das gilt natürlich auchfür das vorliegende Buch. Im Vergleich zu seinem Vorgänger »Jetzt lerne ichVisual Basic 6.0« ist es aber nicht mehr ganz so einfach. Wie ist das zu ver-stehen? Hier eine Analogie: Stellen Sie sich einen Hochsprungwettbewerbvor, bei dem es tolle Preise zu gewinnen gibt. Jeder möchte natürlich dabeisein. Und jeder schafft es auch relativ problemlos, denn die Latte hängt beietwa 1,10 Meter (selbst ein relativ ungeübter Mensch sollte damit keine Pro-bleme haben). Alle sind zufrieden (bis auf diejenigen, die sich unterfordert füh-len und der Meinung sind, das sei unter ihrem Niveau – sie programmieren inC++, verzählen sich mit den geschweiften Klammern und Semikolons undstöhnen jeden Tag über die Bürde ihrer Tätigkeit). Nun betritt .NET die Büh-ne. Es gibt einen neuen Wettbewerb mit noch tolleren Preisen. Wieder wollenalle mitmachen. Doch dieses Mal hat der Veranstalter die Latte um 40 cm hö-her gehängt. Die Folge: Was einst so leicht aussah, hat es nun in sich. Vielenehmen lässig Anlauf und stellen erstaunt (und nicht gerade erfreut) fest, dassdie Latte erstaunlich hoch hängt. Doch es gibt wie immer eine gute Nachricht.Wer ein wenig trainiert, sich über Technik (die war beim 1,10-m-Sprung nochnicht notwendig) Gedanken macht, die Sache optimistisch betrachtet undcool bleibt, schafft auch die neue Höhe. Es winkt das schöne Gefühl, es ge-schafft zu haben, die Aussicht auf tolle Preise, mehr Selbstvertrauen und mehrFitness, die sich auch auf andere Bereiche auswirkt.

Was hat diese kleine Analogie mit Visual Basic .NET zu tun? Im Vergleich zumVorgänger hat Microsoft die Latte für den Einstieg deutlich höher angesetzt.Zwar ist es im Prinzip genauso simpel wie früher, ein kleines »Hallo, Welt«-

Page 24: Jetzt lerne ich Visual Basic.NET  GERMAN

24

Einleitung

Programm umzusetzen, doch sobald es um mehr geht (etwa um Dateizugriffe,den Umgang mit Datenstrukturen und Systemfunktionen oder auch die Aus-lieferung des Programms), wird es deutlich anspruchsvoller und es werdenKenntnisse vorausgesetzt, die man sich nicht unbedingt an einem Wochen-ende aneignen kann1. Es ist wichtig, den feinen Unterschied zu verstehen. Vi-sual Basic .NET ist nicht schwerer zu lernen als seine Vorgänger, es setzt nuretwas mehr Engagement und die Fähigkeit, in verschiedene Richtungen zudenken, voraus. Vor allem muss man bereit sein, sich mit dem großen Bild,konkret dem .NET-Framework, zu beschäftigen (mehr dazu in Kapitel 2). BeiVisual Basic 6.0 war es nicht notwendig, über DLLs, API-Funktionen und daszwar allgegenwärtige, durch die Visual-Basic-Umgebung aber gut versteckteComponent Object Model (COM) Bescheid zu wissen. Man konnte jahrelangwunderbar programmieren und die tollsten Programme schreiben (sofernman bestimmte Bereiche, wie das Programmieren mit Komponenten, aus-klammerte). Bei Visual Basic .NET ist es praktisch unmöglich, das .NET-Framework länger als über die ersten kleinen Beispiele hinaus zu ignorieren,da es mit der Programmiersprache untrennbar verbunden ist (auch wenn sichMicrosoft, wie bereits erwähnt, Mühe gegeben hat, ein paar Dinge vor denProgrammierern zu verstecken). Was sollen Sie daraus lernen? Denken Sienoch einmal an die kleine Analogie mit dem Hochsprungwettbewerb. Um ihnzu gewinnen, waren ein wenig Training, etwas mehr Disziplin und vor allemgrößere Entschlossenheit erforderlich. Diese drei Dinge benötigen Sie auch,um die »Herausforderung« Visual Basic .NET zu meistern. Am Ende winkt alsHauptpreis, dass Sie von sich sagen können, mit Visual Basic .NET eine dermodernsten Programmiersprachen zu beherrschen und mit .NET eine derleistungsfähigsten und umfangreichsten Systemplattformen zu kennen, die inden nächsten Jahren in der Softwareindustrie weltweit eine herausragendeRolle spielen wird. Dieses Buch soll Ihnen dabei behilflich sein.

Die Buch-CD

Neben allen Beispielen, die in diesem Buch vorgestellt werden, enthält dieBuch-CD auch das (kostenlos erhältliche) .NET Framework-SDK, die Voraus-setzung, um unter .NET programmieren zu können. Da es auch die Spra-chencompiler enthält (unter anderem jenen für Visual Basic .NET), ist es alles,was Sie am Anfang benötigen, um mit der .NET-Programmierung starten zukönnen. Außerdem enthält das Buch einen kleinen, praktischen Editor, dereine angenehme Alternative zu Notepad darstellt. Es handelt sich um dasOpen-Source-Tool Sharp Develop, das Sie im gleichnamigen Unterverzeich-nis finden.

1. Höchstens an einem langen Wochenende.

Page 25: Jetzt lerne ich Visual Basic.NET  GERMAN

25

Einleitung

Die Beispielprogramme auf der Buch-CD

Alle größeren Beispiele in diesem Buch finden Sie selbstverständlich auch aufder Buch-CD (und parallel auf der Homepage zu diesem Buch). Das Verzeich-nis heißt Quellen, aufzufinden im Ordner Buchdaten. Damit Sie die Beispieleeinfacher finden, ist im Buch zu jedem Beispiel, das auf der Buch-CD zu fin-den ist, der Dateiname angegeben. Der Hinweis »vbnet0401.vb« bedeutet,dass Sie das Listing zu diesem Beispiel in der Datei vbnet0401.vb finden. AlleBeispiele wurden von mir mehrfach geprüft. Sollte sich wider Erwarten einListing nach dem Abtippen nicht kompilieren lassen oder sollte Ihnen etwas»merkwürdig« vorkommen, orientieren Sie sich bitte an den Listings auf derBuch-CD im Verzeichnis Quellen. Aktuelle Versionen dieser Beispiele (undvieles mehr) finden Sie im Internet unter www.nanobooks.net.

Und noch einen kleinen Service enthält die Buch-CD. Im Verzeichnis\Quellen\SampleSummary finden Sie das Visual Basic .NET-Projekt Sample-Summary, das eine HTML-Übersicht aller in einem ausgewählten Verzeichnisenthaltenen VB-Dateien anfertigt (die Exe-Datei finden Sie im Unterverzeich-nis \bin).

Danksagungen

Bedanken möchte ich mich bei meinem Lektor Erik Franz für die wirklich an-genehme Zusammenarbeit und bei Martin Szugat, der das Manuskript nocheinmal kritisch gelesen hat und dabei die eine oder andere »Unebenheit« imOberflächendesign aufspürte. Sollten das Buch und vor allem die Listings wi-der Erwarten noch Fehler enthalten, gehen diese alle ausschließlich auf mein(Fehler-)Konto.

Kontakt zum Autor und Verlag

Wie immer freut sich der Autor über Kritik, Anregungen, Hinweise auf Fehler,Unstimmigkeiten und andere Dinge, und natürlich auch über Lob. (Bei mehrals drei Komplimenten pro Zuschrift gibt es aber keinen Preisnachlass beikünftigen Büchern – diese Zuschriften werden von einem ausgeklügeltenE-Mail-Filter automatisch erkannt und an Herrn Ralf Buschner im Markt+Technik Verlag weitergeleitet, der sich um die Beantwortung kümmern wird.)Sie erreichen den Autor praktisch rund um die Uhr unter:

[email protected]

Bei allgemeiner Kritik, Fragen, Anregungen, Problemen mit der Buch-CDoder Reklamationen wenden Sie sich bitte direkt an den Verlag:

[email protected]

Page 26: Jetzt lerne ich Visual Basic.NET  GERMAN

26

Einleitung

Sollte es Korrekturen und ergänzende Hinweise geben, finden Sie diese aufder Homepage des Buchs:

www.activetraining.de/jlvbnet

Hier stehen auch die Beispiele des Buchs zum Download bereit (für den Fall,dass die Buch-CD nicht auffindbar sein sollte).

Vorbereitungen für .NET und das Buch

In dieser kurzen Übersicht geht es um die notwendigen Vorbereitungen, damitIhr Computer ».NET-fähig« wird. Weitere Informationen zum .NET-Frame-work-SDK lesen Sie in Anhang C.

Das .NET-Framework-SDK installieren

Voraussetzung dafür, um Visual Basic .NET-Programme kompilieren und aus-führen zu können, ist die Installation das .NET-Framework-SDK, das nebenden Laufzeitdateien auch die Compiler enthält (mehr dazu in Anhang C). Siefinden das .NET-Framework-SDK auf der Buch-CD oder (falls die CD aus ir-gendeinem Grund nicht griffbereit sein sollte) im Internet unter der allge-meinen Adresse http://msdn.microsoft.com/net. (Der Download ist ca. 130Mbyte groß, was mit z.B. T-DSL, ADSL oder Kabelmodem relativ problemloszu bewältigen ist und nicht die ganze Nacht dauert – das SDK kann aber auchin zehn »Portionen« á 13 Mbyte heruntergeladen werden.)

Die Installation des .NET-Framework-SDK ist sehr einfach. Starten Sie dieExe-Datei auf der Buch-CD (sie trägt den Namen NetFramework-SDK_10.exe) oder die heruntergeladene Datei. Alles weitere passiert dannautomatisch.

Hard- und Softwarevoraussetzungen

Da das .NET-Framework-SDK keine grafische Oberfläche besitzt, ist es sehrviel anspruchsloser als Visual Studio .NET. Ein Pentium 350-MHz-Prozessor(oder ein vergleichbarer Prozessor) mit 64 Mbyte RAM sollten (mehr als) aus-reichend sein, um alle Beispiele in diesem Buch problemlos kompilieren zukönnen. Für Visual Studio .NET sind die Hardwarevoraussetzungen etwas hö-her. Hier benötigt der Computer vor allem mehr Arbeitsspeicher (mindestens128 Mbyte). Auch die Festplatte sollte großzügig bemessen werden, denn diekomplette Installation belegt über ein 1 Gbyte und stößt damit in neue Dimen-sionen vor. (Schuld daran ist aber in erster Linie die umfangreiche Dokumen-tation.)

Page 27: Jetzt lerne ich Visual Basic.NET  GERMAN

27

Einleitung

Bei den Softwarevoraussetzungen ist die Angelegenheit relativ simpel: Vor-ausgesetzt wird mindestens Windows NT 4.0 mit Service Pack 6a oder Win-dows 2000 Professional. Es ist wichtig, zu unterscheiden, dass .NET-Anwen-dungen (sofern sie keine Komponenten voraussetzen, die nur unter Windows2000/XP zur Verfügung stehen) auch unter Windows 98 laufen. LediglichWindows 95 bleibt komplett außen vor und muss ersetzt werden.

1

Der Aufruf des Kommandozeilencompilers

Alle Beispiele in diesem Buch (mit Ausnahme des letzten Beispiels in Kapitel14) sind (relativ) einfache Konsolenprogramme, die sich mit dem Visual Basic.NET-Kommandozeilencompiler Vbc.exe übersetzen lassen. Das Ergebnis iststets eine Exe-Datei (und in Ausnahmefällen auch eine DLL-Datei). Hier einBeispiel für einen Aufruf von Vbc.exe:

vbc HalloWelt.vb

Wenn Sie das Programm Vbc.exe (das ist der Visual Basic .NET-Compiler) inder Eingabeaufforderung aufrufen, wird die Datei HalloWelt.vb kompiliert.Das Ergebnis ist eine Datei mit dem Namen HalloWelt.exe. Dies ist ein.NET-Programm, das aber trotzdem durch Eingabe seines Namens zur Aus-führung gebracht wird.

Und wieso kann Vbc.exe so ohne weiteres aufgerufen werden? Es geht, weilsich die Datei im Verzeichnissuchpfad befindet, der über die Umgebungsvari-able Path abgefragt und gesetzt werden kann. Dafür sorgt die Installation des.NET-Framework-SDK. Sollte dies wider Erwarten nicht geschehen sein (et-wa, weil die Installation nicht bis zum Ende durchlief) oder der neue Wert derPath-Variablen wieder überschrieben wurde, muss der Pfad nachträglich wie-derhergestellt werden (bei Windows 2000/XP in den Systemeigenschaften –im Register Erweitert). Der Verzeichnispfad der .NET-Compiler lautet %sys-temroot%\Microsoft.NET\Framework\v1.0.3317. Die Tools des .NET-Framework-SDK befinden sich in einem anderen Verzeichnis, es lautet \Pro-gramme\Microsoft Visual Studio.NET\FrameworkSDK\Bin.

Die kompletten Laufzeitumgebungen für .NET sind etwa 20 Mbyte groß.Das bedeutet jedoch nicht, dass diese Dateien mit jedem Visual Basic .NET-Programm zusammen ausgeliefert werden müssen (das wäre auf die Daueretwas unpraktisch). Es bedeutet lediglich, dass diese Dateien einmalig auf ei-nem anderen Computer installiert werden müssen. Alle weiteren .NET-Pro-gramme setzen auf diesen Laufzeitdateien auf. Der Umfang der Exe-Dateikleiner Visual Basic .NET-Programme beträgt lediglich einige Kbyte. In die-sem Punkt hat sich also nicht allzu viel geändert.

Page 28: Jetzt lerne ich Visual Basic.NET  GERMAN

28

Einleitung

Abb. 0.1:Unter Umstän-

den muss derVerzeichnis-

suchpfadnachträglichgesetzt oder

geändertwerden

Wenn der Compiler Klassen scheinbar nicht finden kann

In einigen Fällen spricht ein Visual Basic .NET-Programm .NET-Klassen an,die nicht in der »Hauptbibliothek« mscorlib.dll (diese ist automatisch dabeiund muss beim Kompilieren nie angegeben werden) enthalten sind. Dazu ge-hören zum Beispiel jene Klassen, die in System.dll enthalten sind. Damit die-se Programme fehlerfrei übersetzt werden, muss die zuständige Bibliothekbeim Kompilieren über die Option /r eingebunden werden:

vbc TestApp.vb /r:system.xml.dll

Durch diesen Aufruf wird die Bibliothek system.xml.dll mit eingebunden (dergenaue Pfad der Dll-Datei muss nicht angegeben werden, da sich diese imGlobal Assembly Cache befindet und der Compiler daher in der Lage ist, siezu lokalisieren). Zu welcher Datei (der Fachausdruck lautet Assembly) eineKlasse letztendlich gehört, erfahren Sie aus der Dokumentation zum .NET-Framework-SDK (oder über den Objektbrowser von Visual Studio .NET). Beiden Beispielen wird im Buch selbstverständlich darauf hingewiesen, welchezusätzlichen DLLs eingebunden werden müssen.

Ein erster ».NET-Check«

»Are you ready for .NET?« Nun, das lässt sich schnell feststellen. Der folgende»Schnelltest« stellt fest, ob ein .NET-Programm auf dem Computer ausgeführtwerden kann:

Schritt 1 Öffnen Sie die Eingabeaufforderung (z.B. über den Ausführen-Befehl imStartmenü und Eingabe von »cmd«).

Page 29: Jetzt lerne ich Visual Basic.NET  GERMAN

29

Einleitung

Schritt 2Starten Sie Notepad durch Eingabe von »notepad ready.vb« und bestätigenSie das Anlegen einer neuen Datei.

Schritt 3Geben Sie die folgendenden Zeilen ein:

Imports System.ConsoleModule basTestSub Main () Writeline ("Hi, ich bin bereit für .NET – am {0}", _ date.now)End SubEnd Module

Schritt 4Speichern Sie die Datei ab. Sie liegt nun unter dem Namen ready.vb vor.

Schritt 5Rufen Sie in der Eingabeaufforderung den Visual Basic .NET-Compiler auf:

vbc ready.vb

Ging alles gut, sollte in der nächsten Zeile der weltbewegende Satz zusammenmit dem aktuellen Datum erscheinen.

Abb. 0.2:Das tönt gut, der erste .NET-Test ist be-standen – das Visual Basic. NET-Pro-gramm meldet sich

Falls etwas schief geht

Auch wenn die meisten Beispiele in diesem Buch sehr simpel sind, heißt dasnicht, dass sie auf Anhieb funktionieren werden (sie wurden natürlich getestet,bevor sie auf die Buch-CD gelangten). Insbesondere Ihre eigenen Beispiele wer-den unter Umständen ein paar Anläufe benötigen. Es gibt grundsätzlich zweiKategorien von »Fehlern«. Solche, die bereits beim Kompilieren erkannt wer-den, und solche, die sich erst während der Programmausführung auswirken. Imersten Fall zeigt der Compiler eine mehr oder weniger umfangreiche Fehler-meldung an (es können auch mehrere sein). Sie müssen nun den oder die Feh-ler lokalisieren, korrigieren, die Datei speichern und den Compiler erneut star-ten. (Da die Fehlermeldung in der Regel auch die Zeilennummer der Zeileumfasst, in der der Fehler auftrat, ist es relativ einfach.) Im zweiten Fall könnenSie zunächst gar nicht viel machen, denn ein Fehler, der während der Program-

Page 30: Jetzt lerne ich Visual Basic.NET  GERMAN

30

Einleitung

mausführung auftritt, führt zu einer Ausnahme, und die ruft automatisch den sogenannten Debugger auf. Es erscheint eine Dialogbox, in der Sie gefragt wer-den, ob Sie das Programm »debuggen« möchten. Antworten Sie auf diese Fragestets mit »No«, da das Debuggen in diesem Buch nicht behandelt wird. Damitwird die Programmausführung beendet und die Fehlermeldung, die zu der Aus-nahme geführt hat, wird noch einmal angezeigt, so dass Sie einen gewissen An-haltspunkt erhalten. Diese Laufzeitfehler sind keine Fehler im Programmtext,sondern Befehle, die zu einer Situation führten, in denen der Compiler nichtweiter weiß. Eine solche Situation können Sie probeweise herbeiführen, indemSie in das kleine Beispielprogramm aus dem letzten Abschnitt vor dem BefehlEnd Sub die folgenden beiden Befehle eingeben:

Dim o As ObjectWriteline(o.ToString)

Speichen Sie die Datei wieder ab, rufen Sie den Compiler vbc.exe erneut aufund führen Sie die resultierende Datei ready.exe aus. Zwar erscheint die Aus-gabe, doch anschließend (das Rumpeln der Festplatte deutet es bereits dezentan) öffnet sich das Debugger-Dialogfeld: Ein Laufzeitfehler ist aufgetreten,weil Sie versucht haben, den Inhalt einer noch leeren Objektvariablen o mitToString auszugeben. Diese kleinen (Flüchtigkeits-)Fehler werden Ihnen amEnde des Buchs nur noch sehr selten unterlaufen.

Abb. 0.3:Upps, da istwohl etwas

schiefgelaufen– wenn dieseDialogbox er-

scheint, hat dasVisual Basic

.NET-Pro-gramm einen

Laufzeitfehlerverursacht

Page 31: Jetzt lerne ich Visual Basic.NET  GERMAN

31

KAPITEL 1

Das erste Visual Basic .NET-Beispiel

Nachdem Ihr Computer nun hoffentlich »ready for .NET« ist, sollen Sie in die-sem Kapitel Ihre ersten kleinen Visual Basic .NET-Programme umsetzen undauf diese Weise einen ersten Eindruck von der Programmierung unter .NETerhalten. Außerdem verschafft Ihnen dieses Kapitel die lernpädagogisch sehrwichtigen Erfolgserlebnisse. Sie tippen ein Beispiel ab, rufen den Visual Basic.NET-Compiler auf, um es zu kompilieren, starten die entstandene Exe-Dateiund es funktioniert. So sollte die Programmierung immer aussehen. Dennochbesitzen die Übungen auch einen praktischen Nutzen. Es macht einen großenUnterschied, ob man mehrere hundert Seiten über .NET liest oder ob man einpaar Zeilen eintippt und abspeichert, den Compiler darüber laufen lässt, be-friedigt registriert, dass es fehlerfrei kompiliert wurde, das Programm startetund feststellt »Heilig´s Blechle, das ist ja gar nicht so kompliziert«.

Die Themen für dieses Kapitel:

� Auch .NET kann Hallo sagen

� Der allgemeine Aufbau einer Konsolenanwendung

� Ein paar »Spezialitäten« in .NET

� Die wichtigsten Compileroptionen

1.1 Auch .NET kann Hallo sagen

Es hat keinen Sinn, es gibt keine Alternativen und diese Tatsache nicht zu ak-zeptieren, wäre pure Zeitverschwendung. Die Rede ist vom »Hallo, Welt«-Pro-gramm, das Programmierer wie Buchautoren gleichermaßen benutzen, um

Page 32: Jetzt lerne ich Visual Basic.NET  GERMAN

32

Das erste Visual Basic .NET-Beispiel1zu zeigen, dass alles doch wie immer ganz einfach ist. Auch wenn das »Hallo,Welt«-Programm vor kurzem sein 30-jähriges Bestehen gefeiert haben dürfte1

und seine Wirkung inzwischen alles andere als originell ist, ist es immer nochzeitgemäß. Der Programmierer tippt ein paar Zeilen ein, drückt auf einenKnopf, sieht ein knappes »Hallo, Welt« (oder einen vergleichbar inhaltsschwe-ren Satz auf dem Bildschirm) und ist zufrieden.

Führen Sie zur Umsetzung eines »Hallo, Welt«-Programms in Visual Basic.NET die folgenden Schritte aus:

Schritt 1 Starten Sie Notepad, den FAS Script Editor, Emacs oder einen anderenEditor.

Schritt 2 Tippen Sie alle Zeilen aus Listing 1-1 ab. Allerdings ohne die Zeilennummern(etwa 1:), die jeder Befehlszeile vorausgehen und lediglich zur Orientierung in-nerhalb des Listings dienen (innerhalb der Visual Studio .NET-Entwicklungs-umgebung ist es ebenfalls möglich, Zeilennummern anzuzeigen – bei der Ein-gabe eines Listings über einen anderen Editor werden Zeilennummern alsSprungmarken interpretiert).

Schritt 3 Speichern Sie die Datei unter dem Namen »HalloWelt.vb« ab, am besten in ei-nem Verzeichnis, das sich über die Kommandozeile leicht erreichen lässt.

Schritt 4 Öffnen Sie die Eingabeaufforderung, wechseln Sie in das Verzeichnis, in demsich die Datei HalloWelt.vb befindet, und starten Sie den Visual Basic .NET-Compiler wie folgt:

vbc hallowelt.vb

Enthält die Quelltextdatei keine Tippfehler, wandelt der Compiler die Datei ineine Datei mit dem Namen HalloWelt.exe um. (Das Ergebnis wird in der.NET-Welt auch als Assembly bezeichnet – mehr dazu in Kapitel 2.)

Schritt 5 Geben Sie in die Eingabeaufforderung »HalloWelt« ein, um die Exe-Datei zustarten. Kurz darauf sollte eine kleine Ausgabe erscheinen.

Das war’s. Sie haben Ihr erstes Visual Basic .NET-Programm erfolgreich um-gesetzt. Auch wenn es winzig klein ist und noch nicht ansatzweise erahnenlässt, warum um .NET so viel Aufhebens gemacht wird (keine Sorge, Sie müs-sen nicht alle Ihre Programme mit Notepad eintippen), macht es deutlich,dass sich auch bei der .NET-Programmierung alles um einfache und elemen-tare Dinge dreht. Wesentlich komplizierter werden die weiteren Beispiele indiesem Buch auch nicht werden, wobei Sie am Ende des Buchs aber alles Wis-

1. Soweit ich mich erinnern kann, wurde »Hallo, Welt« in den Bell Laboratories in Zusammen-hang mit der Entwicklung von Unix oder einem seiner Vorläufer erfunden. Wurde das Pro-gramm auf einen neuen Computer übertragen, muss man ja irgendwie feststellen können,dass es funktioniert. Dies geschah durch Ausgabe eines »Hello, world« (auf Deutsch »Hallo,Welt«). Die Ausgabe erfolgte übrigens auf einer Art Fernschreiber, was im Jahre 1971 absolut»state of the art« gewesen sein dürfte.

Page 33: Jetzt lerne ich Visual Basic.NET  GERMAN

33

Auch .NET kann Hallo sagen

senswerte über die Grundlagen der Programmierung mit Visual Basic .NETgelernt haben.

Listing 1-1:Das »Hallo, Welt«-Pro-gramm in Visual Basic .NET

1:' -----------------------------------------------2:' Das Hallo, Welt-Programm in Visual Basic .NET3:' Jetzt lerne ich Visual Basic .NET4:' -----------------------------------------------

5:Imports System.Console

6:Class App

7: Shared Sub Main()8: WriteLine("Hallo, liebe Welt - es ist jetzt {0}",Date.Now.ToString("hh:mm:ss"))9: ReadLine()10: End Sub11:End Class

Abb. 1.1:Zweifelsohne ein weiteres »Hallo, Welt«-Programm

Die Erklärungen zum »Hallo, Welt«-Programm finden Sie in Tabelle 1.1.

Tabelle 1.1:Die Erklärun-gen zu Listing 1-1

Buch-CD: vbnet0101.vb

Zeile Was passiert hier?

5 Der Imports-Befehl fügt einen Namensraum zum Programm hinzu. Der Namensraum ist System, die Klasse heißt Console, so dass allen Methoden der Klasse (etwa WriteLine) nicht der Namensraum vorangestellt werden muss.

6 Jedes Visual Basic .NET-Programm besteht aus mindestens einer Klasse, die über diesen Class-Befehl definiert wird.

7 Jedes Visual Basic .NET-Programm muss einen Startpunkt besitzen, der aus der Prozedur (Methode) Main besteht. Das Schlüsselwort Shared sagt, dass die Methode auch aufgerufen werden kann, ohne dass die Klasse instanziert werden muss.

Page 34: Jetzt lerne ich Visual Basic.NET  GERMAN

34

Das erste Visual Basic .NET-Beispiel1

1.2 Der allgemeine Aufbau einer Konsolenanwendung

In diesem Buch dreht sich fast alles um Konsolenanwendungen (lediglich Ka-pitel 14 beweist, dass man unter .NET auch mit Fenstern jonglieren kann unddie guten alten Steuerelemente nicht ausgestorben sind). Eine Konsolenan-wendung ist ein Visual Basic .NET-Projekttyp unter vielen, der meistens nuraus einem Modul besteht (wenngleich dies keine Voraussetzung ist) und keinegrafische Benutzeroberfläche besitzt (es ist aber grundsätzlich kein Problem,ein Fenster anzuzeigen – dazu muss lediglich eine Instanz der Klasse Form imNamensraum System.Windows.Forms »eingebaut« werden). Konsolenan-wendungen werden in der Eingabeaufforderung ausgeführt, führen ihre Aus-gaben in der Eingabeaufforderung durch und nehmen Eingaben über die Tas-tatur entgegen. Die Maus kann also getrost beiseite geschoben werden. Wassich zunächst nach einer recht drögen Angelegenheit anhören mag (keineFenster), ist gerade für das Lernen von Visual Basic .NET sehr praktisch. Kon-solenprogramme lassen sich schnell mit Notepad oder einem komfortablerenEditor eintippen und sind prima für kleinere Programme geeignet, die keineaufwändige Fensteroberfläche benötigen. Geradezu ideal sind sie für das Er-lernen einer .NET-Programmiersprache, denn sie beschränken sich auf das,was durch das Programm erklärt werden soll, und enthalten keinen überflüs-sigen Ballast, der das Verständnis erschwert. Konsolenanwendungen sindauch gut dazu geeignet, etwas kompliziertere Sachverhalte, wie Vererbung,Threading oder den Zugriff auf XML-Dateien, zu veranschaulichen. Konso-lenanwendungen laufen unter allen Windows-Anwendungen und sind ein spe-zieller Anwendungstyp, der von der Win32-API unterstützt wird.

8 Die WriteLine-Methode gibt einen Text in der Eingabeaufforderung aus. {0} ist ein Platzhalter für die aktuelle Uhrzeit, die auf die Zeichenkette folgt. Sie wird über die Now-Methode ausgegeben, die einen Wert vom Typ Date-Time liefert, der sowohl die aktuelle Uhrzeit als auch das aktuelle Datum wiedergibt. Indem die Methode TimeOfDay der Date-Klasse auf dem DateTime-Wert aufgerufen wird, wird nur die Uhrzeit ausgegebena.

9 Die ReadLine-Methode wartet auf eine beliebige Eingabe, die durch die Æ-Taste abgeschlossen wird.

10 Hier ist die Prozedur zu Ende.

11 Hier sind die Klasse und damit auch das Programm zu Ende.

a. Wenn Sie der Meinung sind, dass es sehr kompliziert zu sein scheint, die Uhrzeit auszugeben,haben Sie im Moment natürlich Recht. Später relativiert sich alles wieder ein wenig. Erstensist es gar nicht so kompliziert und zweitens können Sie die Uhrzeit auf mindestens ein Dut-zend verschiedene Weisen ausgeben (aber nur, wenn Sie das möchten).

Zeile Was passiert hier?

Page 35: Jetzt lerne ich Visual Basic.NET  GERMAN

35

Der allgemeine Aufbau einer Konsolenanwendung

1

1.2.1 Der allgemeine Programmrahmen einer Konsolen-anwendung

In diesem Abschnitt wird der allgemeine Rahmen einer Konsolenanwendungvorgestellt. Diesen Rahmen können Sie praktisch für alle Übungen, um die esin diesem Buch gehen wird, benutzen.

Listing 1-2:Ein allgemei-ner Programm-rahmen für Visual Basic .NET-Pro-gramme

' -----------------------------------------------' Ein allgemeiner Programmrahmen für Visual Basic .NET' Jetzt lerne ich Visual Basic .NET' Letzte Änderung: ' -----------------------------------------------

Imports System.Console

Class App

Shared Sub Main() WriteLine("Alles klar mit Visual Basic .NET - {0}", _ Date.Now.TimeOfDay) ReadLine() End SubEnd Class

Natürlich müssen Sie am Ende nicht die kleine Erfolgsmeldung zusammen mitder aktuellen Uhrzeit ausgeben. Das ist nur ein Vorschlag, der die Stimmungetwas auflockern soll. Die ReadLine-Methode der Console-Klasse sorgt da-für, dass die Programmausführung anhält und sich das Fenster der Eingabe-aufforderung nicht gleich wieder schließt, nachdem das Programm beendetwurde. Zwingend notwendig ist dieser Befehl aber auch nicht.

0

So war es früher:

Konsolenanwendungen gab es nicht bei Visual Basic 6.0. Das, was dort ei-ner Konsolenanwendung am nächsten kommt, ist ein Standard-Exe-Projekt,das ohne Formular auskommt und mit der Prozedur Main in einem allge-meinen Modul beginnt.

Buch-CD: programmrahmen.vb

Wenn Sie den Rahmen in einer Datei mit dem Namen »Rahmen.vb« spei-chern und vor dem Start eines neuen Programms in die neue Programmda-tei kopieren, müssen Sie den Rahmen nicht jedes Mal neu eingeben.

Page 36: Jetzt lerne ich Visual Basic.NET  GERMAN

36

Das erste Visual Basic .NET-Beispiel1

1.3 Ein paar Spezialitäten in .NET

Das »Hallo, Welt«-Beispiel aus dem letzten Abschnitt hat zwar hoffentlich zueinem schnellen Erfolgserlebnis geführt, konnte aber noch nichts von denneuen Möglichkeiten andeuten, die mit .NET im Allgemeinen und VisualBasic .NET im Speziellen einhergehen. Dieser Abschnitt stellt ein paar Kon-solenanwendungen vor, die etwas mehr in die Tiefe gehen und deutlich ma-chen, auf was es bei der Programmierung unter .NET ankommt. Damit keineMissverständnisse entstehen: Diese Beispiele sollen lediglich einen Ausblickauf kommende Themen in diesem Buch geben, sie werden an dieser Stellenoch nicht erklärt. Probieren Sie die Beispiele der Reihe nach aus, freuen Siesich über den kleinen Aha-Effekt, der sich hoffentlich einstellt, machen Siesich aber über die Details und das genaue Wie und Warum noch keine Gedan-ken. Die Hintergründe werden in den späteren Kapiteln des Buchs erklärt.

1.3.1 Dateizugriffe in Visual Basic .NET

Der folgende Abschnitt veranschaulicht anhand eines für jeden Programmie-rer vertrauten Themas, wie durch Einbeziehen der .NET-Basisklassen Aufga-ben gelöst werden, für die unter früheren Visual Basic-Versionen »fest einge-baute« Befehle und Funktionen verwendet wurden. Diese Befehle gibt es beiVisual Basic .NET nicht mehr – stattdessen kommen die überaus vielseitigenBasisklassen zum Einsatz. Die Programmierung wird dadurch weder kompli-zierter noch anders und auch nicht unbedingt einfacher. Man muss nur ver-stehen, dass Visual Basic .NET keine eingebauten Funktionen mehr besitzt,da es dafür die Basisklassen gibt. Die vertrauten Funktionen früherer Versio-nen stehen bis auf wenige Ausnahmen trotzdem zur Verfügung, nur werdensie über eine Kompatibilitätsklasse angeboten – wenn Sie zum Beispiel die al-len Visual Basic-Programmierern überaus vertraute Rnd-Funktion aufrufen,so rufen Sie in Wirklichkeit eine Methode der Microsoft.VisualBasic-Kompa-tibilitätsklasse auf. Das Resultat ist dasselbe, so dass viele Visual Basic-Pro-grammierer den Unterschied am Anfang gar nicht bemerken werden undauch nicht bemerken müssen. Genug der Vorrede, Listing 1-3 enthält ein klei-nes Visual Basic .NET-Programm, das den Inhalt der (Text-)Datei Msdos.sysausgibt (unter Windows 9x sollte stattdessen die Datei Config.sys benutztwerden). Außerdem wird der Zeitpunkt des letzten Zugriffs auf die Datei an-gezeigt. Das Öffnen und Auslesen der Datei übernimmt kein Befehl bzw. kei-ne eingebaute Funktion. Es wird vielmehr über ein Objekt der Klasse Text-Reader erledigt, das über die OpenText-Methode eines File-Objekts angelegtwird. Anschließend liest die ReadToEnd-Methode des TextReader-Objektsden gesamten Inhalt ein, der über die WriteLine-Methode der Console-Klas-se gleich wieder ausgegeben wird. Der Zeitpunkt des letzten Zugriffs wird überdie GetLastAccessTime-Methode des File-Objekts geliefert. Ist Ihnen aufge-

Page 37: Jetzt lerne ich Visual Basic.NET  GERMAN

37

Ein paar Spezialitäten in .NET

fallen, wie oft in den letzten drei Sätzen die Begriffe Klasse und Objekt ver-wendet wurden? Praktisch alles ist bei Visual Basic .NET objektorientiert undbasiert auf Klassen und Objekten (der kleine, aber nicht ganz unwichtige Un-terschied wird in Kapitel 6.5 erklärt).

Listing 1-3:Einfacher Dateizugriff über eine Text-Reader-Klasse

' -----------------------------------------------' Beispiel für einen Dateizugriff' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.ConsoleImports System.IO

Class App

Shared Sub Main() Dim stPfad As String = "C:\Msdos.sys" Dim Fi As TextReader = File.OpenText(stPfad) WriteLine("Letzter Zugriff: {0}", _ File.GetLastAccessTime(stPfad)) WriteLine(Fi.ReadToEnd) Fi.Close() ReadLine() End Sub

End Class

1.3.2 XML-Dateien lesen und auswerten

XML ist eines jener Schlagworte, die immer wieder in Zusammenhang mit.NET, Web Services und anderen modernen Themen erwähnt werden. Wasan XML so toll ist und wie es genau funktioniert, wird in Kapitel 12 erklärt.Das folgende Beispiel zeigt, wie sich eine XML-Datei über eine .NET-Basis-klasse einlesen und verarbeiten lässt.

Auch wenn dies bereits mit früheren Visual Basic-Versionen unter Einbezie-hung des XML-Parsers in Gestalt einer COM-Bibliothek auf eine sehr ähnli-che Weise möglich war, bieten die .NET-Basisklassen drei wichtige Vorteile:

1. Die XML-Unterstützung ist keine Option, sondern ein fester Bestandteilder Programmierumgebung.

2. Die XML-Klassen sind keine Fremdkörper, sondern werden von den übri-gen Klassen verstanden.

3. Die XML-Unterstützung ist umfassender.

Buch-CD: vbnet0103.vb

Page 38: Jetzt lerne ich Visual Basic.NET  GERMAN

38

Das erste Visual Basic .NET-Beispiel1 Listing 1-4:

Eine einfacheXML-Datei <?xml version="1.0" ?>

<startrek> <Folge Nr="47"> <title>Obsession</title> <stardate>3619.2</stardate> </Folge> <Folge Nr="48"> <title>The immunity syndrom</title> <stardate>4307.1</stardate> </Folge> <Folge Nr="51"> <title>Return to tomorow</title> <stardate>4768.3</stardate> </Folge> <Folge Nr="52"> <title>Patterns of Force</title> <stardate>2534.0</stardate> </Folge>

</startrek>

Listing 1-5:Das Visual

Basic .NET-Programm liestden Inhalt derXML-Datei ein

' -----------------------------------------------' Ein kleines XML-Beispiel' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------Imports System.XmlImports System.Console

Class App

Shared Sub Main() Dim obXMLDoc As XmlDocument = New XmlDocument() Dim stXMLPfad As String = _ "C:\Eigene Dateien\JLVBNET_Beispiele\Startrek.xml" obXMLDoc.Load(stXMLPfad) Dim obRoot As XmlNode = obXMLDoc.DocumentElement Dim obXMLElement As XmlNode For Each obXMLElement In obRoot.ChildNodes WriteLine("Folge Nr. {0}", _ obXMLElement.Attributes("Nr").Value) WriteLine(obXMLElement.ChildNodes(0).InnerText) Next

Buch-CD: startrek.xml

Buch-CD: vbnet0105.vb

Page 39: Jetzt lerne ich Visual Basic.NET  GERMAN

39

Ein paar Spezialitäten in .NET

WriteLine("Alles klar mit .NET und XML!") ReadLine() End SubEnd Class

Wenn Sie das Listing in einer Datei mit der Erweiterung .vb speichern, denCompiler aufrufen und die resultierende Exe-Datei starten, wird der Inhaltaller <Folge>-Markierungen in der Eingabeaufforderung ausgegeben (gege-benenfalls müssen Sie den Pfad der XML-Datei StarkTrek.xml ändern).

Lässt sich das Programm nicht kompilieren und erhalten Sie stattdessen vieleFehlermeldungen? In diesem Fall kann der Compiler das Assembly Sys-tem.xml.dll nicht finden, in dem die XML-Klassen enthalten sind. Sie müssenes beim Aufruf über die Option /r angeben:

vbc vbnet0105.vb /r:system.xml.dll

1.3.3 Herunterladen einer HTML-Datei von einem Webserver

Ein Grund, warum Microsoft in den letzten Jahren mehrere Milliarden Euro indie Entwicklung von .NET gesteckt hat, ist der, dass Internetanwendungeneinfacher zu programmieren sein sollen1. Auch wenn das Thema ASP .NETund die Programmierung von Webanwendungen in diesem Buch nicht behan-delt wird (dafür gibt es einen eigenen Band in der Jetzt lerne ich-Reihe vonMarkt+Technik), soll das folgende Beispiel zeigen, wie sich eine (beliebige)Datei von einem (beliebigen) Webserver herunterladen lässt. Spektakulär istdabei weniger der Zugriff auf das Internet (das ging mit früheren Visual Basic-Versionen auch schon), sondern die nahtlose Integration durch die .NET-Ba-sisklassen.

Das folgende Beispiel setzt voraus, dass der Internet Information Server (IIS)entweder lokal installiert oder über das Netzwerk erreichbar ist und ein virtu-elles Verzeichnis angelegt wurde (in dem Listing heißt es TestWeb), das eineDatei enthält, die in der URL angeben wird. Alternativ muss eine Verbindungzum Internet bestehen und eine beliebige URL angegeben werden (von derdie Standarddatei heruntergeladen wird, meistens heißt sie Default.htm,wenn keine Datei explizit angegeben wird).

Schritt 1Starten Sie Notepad, geben Sie die Befehle aus Listing 1-6 ein und speichernSie Datei unter dem Namen »Htmldownload.vb«.

1. Allein aus diesem Grund steht es praktisch außer Frage, dass sich .NET durchsetzen wird.Und wir Programmierer erhalten das alles im Rahmen des .NET Framework SDK und derASP .NET-Dateien umsonst. Ist Microsoft nicht nett?

Page 40: Jetzt lerne ich Visual Basic.NET  GERMAN

40

Das erste Visual Basic .NET-Beispiel1Schritt 2 Kompilieren Sie Datei und führen Sie sie aus. Hierfür ist der Aufruf des Kom-

mandozeilencompilers in der Form

vbc.exe htmldownload.vb /r:system.dll

notwendig. Wenn alles klappt, sollte kurz danach der Inhalt der heruntergela-denen (HTML-)Datei in der Eingabeaufforderung ausgegeben werden.

Listing 1-6:Dieses Visual

Basic .NET-Programm lädteine Datei von

einem Web-server herunter

' -----------------------------------------------' Download einer HTML-Datei' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------Imports SystemImports System.ConsoleImports System.NetImports System.IO

Class App Shared Sub Main() Try Dim obWeb As HttpWebRequest = _ HttpWebRequest.Create _ ("http://localhost/TestWeb") Dim obResp As HttpWebResponse = obWeb.GetResponse() Dim obSt As Stream = obResp.GetResponseStream() Dim obStRead As StreamReader = New _ StreamReader(obSt) Dim sZeile As String Do sZeile = obStRead.ReadLine() WriteLine(sZeile) Loop Until obStRead.Peek() = -1 Catch obEx As SystemException WriteLine("Laufzeitfehler: {0}", obEx.Message) Finally WriteLine("Alles klar mit .NET!") End Try End SubEnd Class

1.3.4 Zugriff auf die Metadaten eines Assembly

Was sich zunächst recht trocken anhören mag, ist bei .NET eine hochinteres-sante Angelegenheit. Sämtliche Informationen über die Typen eines Pro-gramms (das heißt die Klassen und deren Eigenschaften) stehen auch zurLaufzeit zur Verfügung. Es ist zum Beispiel überhaupt kein Problem, ein As-

Buch-CD: vbnet0106.vb

Page 41: Jetzt lerne ich Visual Basic.NET  GERMAN

41

Ein paar Spezialitäten in .NET

sembly (also ein .NET-Programm) zur Laufzeit zu laden, seine Klassen nacheiner bestimmten Methode zu durchsuchen, ihre Parameternamen und Da-tentypen abzufragen und die Methode anschließend aufzurufen. Diese Infor-mationen werden als die Metadaten des Programms bezeichnet1. Genauso istes möglich, ein Assembly komplett zur Laufzeit anzulegen, und vieles mehr.Das folgende Beispiel führt eine nützliche Aufgabe durch, denn das Pro-gramm zählt alle Typen (Klassen) zusammen, die in allen Assemblies enthal-ten sind, die im .NET-Verzeichnis zu finden sind.

Schritt 1Starten Sie Notepad, geben Sie den Inhalt aus Listing 1-7 ein und speichernSie das Ganze unter dem Namen »AssemblyLister.vb«.

Schritt 2Passen Sie den Verzeichnispfad des .NET-Verzeichnisses an. Es ist ein Unter-verzeichnis des Windows-Verzeichnisses.

Schritt 3Kompilieren Sie das Programm durch den Aufruf des Visual Basic .NET-Compilers:

vbc AssemblyLister.vb

Schritt 4Starten Sie das Programm. Ging alles gut, sollten eine Reihe von Verzeichnis-pfaden ausgegeben werden. Die letzte Zeile enthält die Gesamtzahl aller Ty-pen (Klassen), die in allen durchsuchten Assemblies gefunden wurden.

Listing 1-7:Das folgende Visual Basic .NET-Pro-gramm zählt alle Typen in allen .NET-Assemblies zusammen

' -----------------------------------------------' Typenzählung in Assemblies' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports SystemImports System.IOImports System.ConsoleImports System.Reflection

Class Test Shared Sub Main() Dim stPfad As String = _ "C:\WINXP\Microsoft.NET\Framework\v1.0.3317" Dim stDatei As String Dim aDateien() = Directory.GetFiles(stPfad, _ "system*.dll") Dim Typen() As Type Dim inSumme As Integer Dim t As Type

1. Unter früheren Visual Basic-Versionen übernahmen die Typenbibliotheken eine ähnliche Auf-gabe, nur nicht so weitreichend.

Buch-CD: vbnet0107.vb

Page 42: Jetzt lerne ich Visual Basic.NET  GERMAN

42

Das erste Visual Basic .NET-Beispiel1 Dim obAss As [Assembly] For Each stDatei In aDateien Try obAss = [Assembly].LoadFrom(stDatei) Typen = obAss.GetTypes() WriteLine("Anzahl Typen in {0} {1}", _ stDatei, Typen.Length) inSumme += Typen.Length Catch WriteLine("{0} ist kein gültiges Assembly!", _ stDatei) End Try Next WriteLine("Gesamtzahl Typen: {0}", inSumme) ReadLine() End SubEnd Class

1.3.5 Aufruf einer Windows-API-Funktion

Zum Schluss ein kleines Beispiel, das vor allem für jene erfahrenen VisualBasic-Programmierer gedacht ist, die schon einiges über Visual Basic .NETgehört haben und nun vielleicht befürchten, dass alles anders ist und keinerder vertrauten Programmbefehle mehr übernommen werden darf. Das ist na-türlich nicht so, Visual Basic .NET ist bei weitem nicht so anders wie es viel-leicht zunächst den Anschein haben mag. Auch API-Funktionen sind weiter-hin erlaubt, sie werden (im »Kompatibilitätsmodus«) praktisch auf die gleicheWeise aufgerufen (den Declare-Befehl gibt es auch bei Visual Basic .NET).Das folgende Beispiel ruft eine beliebte Win32-API-Funktion auf. Statt einesDeclare-Befehls (der für Visual Basic .NET 1:1 übernommen wurde) verwen-det es die »wahre« .NET-Technik über das <DllImport>-Attribut, die zwar einwenig anders aussieht, aber alles andere als schwerer anzuwenden ist.

Listing 1-8:Der Aufrufeiner API-

Funktion inVisual Basic

.NET

' -----------------------------------------------' Aufruf einer API-Funktion mit DllImport' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------Imports SystemImports System.Runtime.InteropServices

Class App <DllImport("winmm.dll", EntryPoint:="sndPlaySoundA")> Public Shared Function PlayWav _ (ByVal lpszName As String, ByVal dwFlags As Integer) As Integer End Function

Buch-CD: vbnet0108.vb

Page 43: Jetzt lerne ich Visual Basic.NET  GERMAN

43

Die wichtigsten Compiler-Optionen

Shared Sub Main() Dim stPfad As String = "C:\Eigene Dateien\Ufo.wav" Dim nRet As Integer nRet = PlayWav(stPfad, 0) End Sub

End Class

Wenn Sie das Listing in einer Datei mit der Erweiterung .vb speichern, denCompiler aufrufen und die resultierende Exe-Datei starten, wird die DateiUfo.wav im Verzeichnis Eigene Dateien (gegebenenfalls müssen Sie den Pro-grammpfad der Wav-Datei ändern oder eine andere Datei auswählen) abge-spielt.

1.4 Die wichtigsten Compiler-Optionen

Halten wir kurz inne, um uns dem Visual Basic .NET-Compiler zuzuwenden(mit der Programmierung geht es im nächsten Abschnitt weiter). Der Compi-ler ist jenes Programm, das allgemein aus einer Textdatei Maschinencodemacht. Wie Sie in Kapitel 2 noch sehr viel ausführlicher erfahren werden,trifft dies auch auf den Visual Basic .NET-Compiler zu. Allerdings ist die Ma-schine, um die es geht, nicht der Prozessor Ihres Computers, sondern dieCommon Language Runtime (CLR), das heißt eine virtuelle Maschine, dieauf Software basiert (daher das Attribut »virtuell«). .NET-Compiler erzeugenkeinen Maschinencode, sondern stattdessen Befehle in einer sehr maschinen-nahen Sprache, die als Microsoft Intermediate Language (MSIL bzw. meis-tens nur IL) bezeichnet wird. Auch in diesem wichtigen Punkt werden Sie aufKapitel 2 vertröstet, wo Sie den IL-Code sogar an einem kleinen Beispiel ken-nen lernen werden (wenngleich IL für die Programmierung in Visual Basic.NET normalerweise keine Rolle spielt). Merken Sie sich vorerst nur, dass derCompiler bei Visual Basic .NET eine unscheinbare Datei mit dem NamenVbc.exe ist, die keine Benutzeroberfläche besitzt und daher über die Kom-mandozeile aufgerufen wird.

Der Visual Basic .NET-Compiler besitzt folgende Eigenschaften:

� Er macht aus einer Textdatei (die im Allgemeinen die Erweiterung .vb be-sitzt), je nach Compiler-Option, eine Exe-Datei (Programmdatei) oder Dll-Datei (.NET-Komponente).

� Die erzeugte Datei erhält stets IL-Code (Intermediate Language) – mehrdazu in Kapitel 2.

� Der Compiler-Lauf kann über das Tool Nmake aus dem .NET-Frame-work-SDK und eine Textdatei gesteuert werden, die unter anderem dieNamen der zu kompilierenden Dateien enthält. Auf diese Weise lassen

Page 44: Jetzt lerne ich Visual Basic.NET  GERMAN

44

Das erste Visual Basic .NET-Beispiel1sich mehrere Dateien auf einmal bequem kompilieren (dies wird für dieBeispiele in diesem Buch aber keine Rolle spielen).

3Der folgende Aufruf des Visual Basic .NET-Compilers kompiliert die DateiHallovb.vb, wobei das resultierende Assembly den Namen FirstApp.exe er-halten soll:

vbc Hallovb.vb /out:FirstApp

Tabelle 1.2:Die Compiler-Optionen des

Visual Basic.NET-Com-

pilers imÜberblick

Option Bedeutung

/out:file Gibt den Namen der Ausgabedatei an, falls diese vom Namen der Quelldatei abweichen soll.

/target:exe Legt fest, dass eine Konsolenanwendung erstellt werden soll (Standardeinstellung). Abkürzung /t.

/target:winexe Legt fest, dass eine Windows-Anwendung erstellt werden soll.

/target:library Legt fest, dass eine Bibliotheksdatei erstellt werden soll.

/target:module Legt fest, dass lediglich ein Modul (es erhält die Erweite-rung .NetModule) erstellt werden soll.

/addmodule:<Datei> Fügt ein Modul zu einem Assembly hinzu.

/recurse:<Platzhalter> Alle Dateien im aktuellen Verzeichnis und seinen Unter-verzeichnissen einschließen, die dem Platzhalter entspre-chen.

/reference:<Dateiliste> Fügt eine oder mehrere Referenzen auf andere Assemb-lies hinzu.

/linkresource:<Resinfo> Verknüpft die angegebene Datei als eine externe Assem-bly-Ressource.

/resource:<Resinfo> Bindet die angegebene Datei als eine Assembly-Ressource ein.

/win32icon:<Datei> Die angegebene Ico-Datei wird als Programmsymbol der Windows-Anwendung verwendet.

/win32resource:<Datei> Die angegebene Res-Datei wird als Ressourcen-Datei ein-bezogen.

/optimize[+|-] Schaltet die Compileroptimierung ein oder aus.

/removeintchecks[+|-] Schaltet die Überprüfung auf Ganzzahlenüberlauf ein oder aus.

/debug[+|-] Fügt in das Assembly Debug-Informationen ein (+).

/debug:full Fügt in das Assembly die vollständigen Debugging-Infor-mationen ein.

/debug:pdbonly Erstellt lediglich eine Pdb-Datei.

/nowarn Warnungen werden deaktiviert.

Page 45: Jetzt lerne ich Visual Basic.NET  GERMAN

45

Zusammenfassung

1.5 Zusammenfassung

Visual Basic .NET ist eine durchweg objektorientierte Programmiersprache,bei der jedes Programm mindestens aus einer Klasse besteht und alle verwen-deten Datenelemente wiederum Objekte aus den .NET-Basisklassen sind. DieProgrammierung mit Visual Basic .NET ist grundsätzlich nicht schwieriger als

/warnaserror[+|-] Warnungen werden wie Fehler behandelt.

/define:<Symbolliste> Definiert globale Symbole, die für die bedingte Kompilie-rung benutzt werden (/d:name=wert).

/imports:<Importliste> Definiert globale Namensräume, die für alle beteiligten Module gelten.

/optionexplicit[+|-] Schaltet den Befehl Option Explicit ein oder aus.

/optionstrict[+|-] Schaltet den Befehl Option Strict ein oder aus.

/rootname-space:<string>

Definiert den obersten Namensraum für alle Typen, die in dem Programm verwendet werden.

/optioncompare:binary Setzt den Befehl Option Compare auf Binary (Standard-einstellung).

/optioncompare:text Setzt den Befehl Option Compare auf Text (Standardein-stellung).

/help Listet alle Optionen auf (Kurzform /?).

/nologo Gibt die Begrüßungszeile nicht aus.

/quiet Es werden keine Meldungen ausgegeben.

/verbose Es werden ausführliche Meldungen ausgegeben.

/baseaddress:<Zahl> Gibt die Basisadresse einer Bibliotheksdatei an.

/delaysign[+|-] Schaltet die verzögerte Signierung eines Assembly mit dem privaten Schlüssel des Entwicklers ein oder aus.

/keycontainer:<string> Legt den Schlüsselcontainer fest, der den »starken Namen« für das Assembly enthält.

/keyfile:<Datei> Gibt die Datei an, die den starken Namen für das Assem-bly enthält.

/libpath:<Pfadliste> Gibt eine Liste von Verzeichnissen an, die auf Metadaten-verweise durchsucht werden (die Verzeichnisse werden mit einem Semikolon getrennt).

/main:<Klasse> Gibt die Klasse an, die die Main-Prozedur enthält, die als Programmeinsprungpunkt verwendet wird.

@<Datei> Gibt eine Datei an, die die Compiler-Optionen enthält, die beim Aufruf übergeben werden sollen.

Option Bedeutung

Page 46: Jetzt lerne ich Visual Basic.NET  GERMAN

46

Das erste Visual Basic .NET-Beispiel1bei seinen Vorgängerversionen. Im Gegenteil, hat man das Prinzip der Ar-beitsteilung zwischen den relativ einfachen Befehlen und Operatoren der Pro-grammiersprache und den sehr umfangreichen Klassen und Objekten des.NET-Framework erst einmal verstanden, erscheint die Programmierungdeutlich einfacher als in der Vergangenheit.

1.6 F&A

Frage 1-1

Schreiben Sie ein Grundgerüst für ein Visual Basic .NET-Programm, das kei-nen ausführbaren Befehl enthält, sich aber fehlerfrei kompilieren lässt.

Frage 1-2

Mit welcher Dateierweiterung werden Visual Basic .NET-Programme übli-cherweise gespeichert?

Frage 1-3

Wie wird eine Visual Basic .NET-Quelltextdatei in eine Exe-Datei kompiliertund was enthält die Exe-Datei?

Frage 1-4

Was ist eine Konsolenanwendung und welche Vorteile bietet sie?

Frage 1-5

Welche Rolle spielen die .NET-Basisklassen?

Frage 1-6

Wie heißt der typische »Ausgabebefehl« in einer Konsolenanwendung?

(Alle Antworten und Lösungen finden Sie in Anhang D.)

Page 47: Jetzt lerne ich Visual Basic.NET  GERMAN

47

KAPITEL 2

Die .NET-Philosophie

Visual Basic .NET trägt den Zusatz .NET nicht umsonst in seinem Namen.Hinter diesem unscheinbaren Kürzel steckt eine brandneue Systemplattform,an der Microsoft einige Jahre gearbeitet hat und die in den kommenden Jah-ren eine sehr wichtige Rolle spielen wird. Auch wenn im Moment noch vielessehr neu und ungewohnt (vielleicht auch ein wenig unnötig – nach dem Motto»Warum alles wieder neu, wenn doch das Vorhandene vollkommen ausrei-chend war?«) erscheinen mag, in ein paar Jahren werden die mit .NET einge-führten neuen Regeln zum Grundrepertoire eines jeden Windows-Program-mierers gehören (müssen). Aus diesem Grund wird in diesem Kapitel auch miteinfachen Worten erklärt, was .NET ist und warum es so wichtig ist. Da sichmit .NET ganze Bücher füllen ließen (und auch schon gefüllt wurden) und indiesem Kapitel eine Einführung in Visual Basic .NET im Vordergrund steht,beschränkt sich dieses Kapitel auf einen Überblick. Sehen Sie dieses Kapitelaber bitte nicht als lästiges Pflichtkapitel an, dass man vielleicht kurz über-fliegt, um es möglichst schnell wieder zu vergessen, da alles ein wenig theo-retisch und langweilig erscheint und keine Beispiele vorkommen. (Es gibt eineAusnahme, bei der es um das Zusammenspiel einer in C# programmiertenKomponente mit einem Visual Basic .NET-Programm geht.) .NET, insbeson-dere das .NET-Framework, sind die Grundlage für alles, was Sie in VisualBasic .NET umsetzen können. Visual Basic .NET ist, wie jede .NET-Program-miersprache, lediglich ein Satz von Befehlen, Schlüsselwörtern, Operatorenund Datentypen. Der ganze »Rest« (und das ist eine ganze Menge) stammt von.NET. Das gilt für alle wichtigen Eigenschaften, wie die Möglichkeit, Basisklas-sen bei der Definition neuer Klassen zu erweitern (Vererbung) oder währendder Ausführung eines Programms weitere Threads zu starten (Multithreading).Diese werden nicht von der Programmiersprache, sondern von der CLR zur

Page 48: Jetzt lerne ich Visual Basic.NET  GERMAN

48

Die .NET-Philosophie2Verfügung gestellt. CLR? Diese wichtige Abkürzung werden Sie am Ende desKapitels auswendig können. Das gilt aber vor allem für die Basisklassen des.NET-Framework, die einen großen Teil der Windows-API und alle Funktio-nen ersetzen, die bei früheren Versionen durch interne Funktionen der Pro-grammiersprache zur Verfügung gestellt wurden. Bei Visual Basic .NET sinddiese Funktionen nicht mehr »fest eingebaut«, sondern Methoden irgendwel-cher Klassen der .NET-Basisklassen.

Mit Philosophie hat dieses Kapitel natürlich nur indirekt etwas zu tun. Der Be-griff soll lediglich andeuten, dass mit .NET eine etwas andere Sichtweise fürdie »Dinge« der Welt (was die Programmierung angeht) einhergeht und es wie-der einmal viele neue Begriffe gibt, die Programmierer verinnerlichen müs-sen. Allen, die sich bereits vor Jahren mit der Programmiersprache Java (dieeine ähnliche Revolution ausgelöst hat) beschäftigt haben, kennen das bereits,ihnen wird einiges sehr bekannt vorkommen (wenngleich .NET sehr viel mehrals nur eine Kopie der Java-Plattform ist). Allen, die sich seit Jahren gemütlichin der Visual Basic-Ecke »eingekuschelt« und die restliche Welt der Program-mierung ein wenig aus den Augen verloren haben, wird die neue Philosophieeiniges an Flexibilität abverlangen, da sich viele vertraute Spielregeln geänderthaben und Visual Basic .NET weniger die Version 7.0 von Visual Basic, son-dern eher die Version 1.0 einer neuen Programmiersprache darstellt, die nurzufälligerweise einen vertrauten Namen besitzt. Aber es hilft alles nichts, denSprung auf die .NET-Ebene muss jeder Programmierer absolvieren, auchwenn es am Anfang ein paar Dehn- und Streckübungen erfordert. Am Endewinken sehr viel mehr Möglichkeiten, so dass sich die Mühe in jedem Falllohnt.

Die Themen für dieses Kapitel:

� Was ist .NET?

� .NET im Gesamtüberblick

� Die Rolle der Common Language Runtime (CLR)

� IL als die neue Maschinensprache

� Die Datentypen des Common Type System (CTS)

� Die Basisklassen

� Die Rolle der Assemblies

� Die Common Language Infrastructure (CLI) für Linux & Co.

Noch ein Tipp, bevor Sie sich in dieses Kapitel »stürzen«: Sehen Sie es in ers-ter Linie als einen Überblick über .NET aus der Vogelperspektive. Nicht jederAspekt wird von Anfang an verständlich sein. Lesen Sie das Kapitel vor allemnoch einmal, nachdem Sie sich ausführlicher mit der Visual Basic .NET-Pro-

Page 49: Jetzt lerne ich Visual Basic.NET  GERMAN

49

Was ist .NET?

grammierung beschäftigt haben. Einige Zusammenhänge, wie etwa die Rolleder Assemblies oder die Ausführung von IL-Code, wirken dann etwas konkre-ter und weniger abstrakt.

2.1 Was ist .NET?

Mit manchen Begriffen ist das so eine Sache. Man hört sie praktisch ständigund überall, doch so richtig verstehen kann man sie zunächst nicht. Das hateine einfache Erklärung. Der Begriff stammt von der Firma Microsoft, die vorallem für ein sehr erfolgreiches Marketing bekannt ist. Gibt es aus dem HauseMicrosoft etwas Neues, dauert es nicht lange und jeder kennt den neuen Mo-detrend beim Namen. Nicht immer muss es zu jedem Begriff eine technischfundierte Definition geben, denn die Kunst des Marketings besteht bekannt-lich darin, etwas zu verkaufen, und dazu gehört auch ein trendiger Name..NET ist jedoch kein Marketingprodukt, auch wenn der Name und der Um-stand, dass es kaum ein Microsoft-Produkt mehr gibt, wo es nicht als Namens-anhang auftaucht, zu der Annahme verleiten könnten. Dazu ist .NET viel zuwichtig und dazu steckt viel zu viel an konkreter Software dahinter (VisualBasic .NET ist nur ein kleines Beispiel). Hinter .NET steckt eine komplettneue Systemarchitektur, an der mehrere Hundert Softwareingenieure in denletzten Jahren mit Hochdruck gearbeitet haben. Im Unterschied zu manchenanderen Technologien ist .NET vollständig und verfügbar, es gibt nichts, waserst »irgendwann« in Zukunft noch fertig gestellt werden müsste. Der griffigeName wurde deswegen gewählt, weil er sich leicht merken lässt, sich gut an-hört und daher auch für die Werbung gut geeignet ist1. Mit Netzwerken oderder Domainerweiterung .net hat unser .NET nichts zu tun (wenngleich es inerster Linie für die Programmierung von Webanwendungen geschaffen wurdeund daher eine direkte Beziehung zum Internet besteht). Der ursprünglicheName lautete übrigens »Next Generation Windows Services«. Suchen Sie sichaus, was Ihnen besser gefällt (wahrscheinlich klingt .NET auf einmal sehr vielattraktiver).

Alles schön und gut, doch was steckt nun genau dahinter? .NET ist der Nameder neuen Systemplattform von Microsoft, auf der in Zukunft immer mehrAnwendungen aufbauen werden. Technisch gesehen ist .NET ein umfangrei-cher Satz von Programmen (die in der Kommandozeile ausgeführt werden)und Systemdateien, die auf jedem Windows-Computer nachträglich installiertwerden müssen (lediglich Windows 95 wird nicht mehr unterstützt)2 und die

1. Und außerdem hat vor Jahren der Lieblingsrivale von Microsoft, die Firma Sun, die vonMicrosoft gerne als »the other company« bezeichnet wird, auf einem ihrer Werbeplakatebehauptet, »sie seien der Punkt in .com«.

2. Was auch vernünftig ist, denn irgendwann muss einmal Schluss sein mit der Abwärtskompati-bilität.

Page 50: Jetzt lerne ich Visual Basic.NET  GERMAN

50

Die .NET-Philosophie2bei künftigen Windows-Versionen (etwa Windows .NET Server) von Anfangan mit dabei sein werden. Wurden diese Dateien installiert, sieht Windows kei-nen Deut anders aus als vorher, denn .NET ist kein Programm und schon garnicht eine Oberfläche, sondern wirkt hauptsächlich unsichtbar im Hinter-grund (lediglich das Startmenü enthält unter Umständen einen neuen Eintrag,über den die Tools des .NET-Framework SDK aufgerufen werden können).Dennoch hat sich etwas Entscheidendes geändert. Windows ist auf einmal inder Lage, .NET-Anwendungen auszuführen, und ist damit endlich im 21.Jahrhundert angekommen. Im Mittelpunkt von .NET steht (aus der Sicht derProgrammierer) die Common Language Runtime (CLR), sozusagen derKern von .NET, der für die Ausführung aller .NET-Anwendungen (dazu gehö-ren natürlich auch jene, die mit Visual Basic .NET programmiert wurden) zu-ständig ist. Eine Laufzeitumgebung, die die Ausführung eines Programmskontrolliert, ist grundsätzlich nichts Besonderes, denn für Visual Basic-Pro-grammierer gibt es sie bereits seit Version 1.0. Die CLR ersetzt die bisherigeLaufzeitumgebung und hat mindestens zwei Vorteile:

� Sie stellt eine Vielzahl sehr leistungsfähiger Funktionen, wie Multithrea-ding, Erweiterung von Klassen (Vererbung), strukturierte Ausnahmebe-handlung für das Abfangen von Laufzeitfehlern, Sicherheit bei der Ausfüh-rung von Programmen und vieles mehr zur Verfügung.

� Die CLR ist für sämtliche .NET-Programmiersprachen zuständig.

Visual Basic .NET-Programmierer nehmen die CLR nur indirekt wahr, da siebei der Programmierung nur in Ausnahmefällen direkt angesprochen wird,sondern die meiste Zeit unsichtbar im Hintergrund wirkt. Sie ist aber das neueFundament, auf dem Visual Basic .NET-Programme aufsetzen und das daherauf jedem Computer vorhanden sein muss, auf dem ein Visual Basic .NET-Programm laufen soll.

Die vorläufige Antwort auf die eingangs gestellte Frage lautet daher: .NET be-steht aus einer neuen Laufzeitumgebung, die sich alle Programme teilen undmit der eine Vielzahl neuer Möglichkeiten für die Programmierer einherge-hen. Was sich hinter der CLR verbirgt, erfahren Sie im nächsten Abschnitt.

2.1.1 Die Rolle der Common Language Runtime (CLR)

Der wichtigste Bestandteil von .NET ist die Common Language Runtime,kurz CLR. Sie ist das »Kontrollprogramm«, das für die Ausführung jedes .NET-Programms, egal, in welcher (.NET-)Sprache es programmiert wird, zuständigist. Sobald Sie eine Exe-Datei starten, die von einem .NET-Compiler (etwa Vi-sual Basic .NET) kompiliert wurde, tritt die CLR in Aktion und übernimmt dieKontrolle über die Ausführung. Diese Programme werden daher auch als ver-walteter Code (engl. »managed code«) bezeichnet, da ihre Ausführung vonder CLR verwaltet wird. Verwaltet bedeutet unter anderem, dass die CLR die

Page 51: Jetzt lerne ich Visual Basic.NET  GERMAN

51

Was ist .NET?

komplette Speicherverwaltung für alle Objekte übernimmt und bei jedem ein-zelnen Befehl prüft, ob er im aktuellen Sicherheitskontext erlaubt ist odernicht. Verwalteter Code ist »hagel- und bombensicher«, da er praktisch nichtabstürzen kann (man soll bekanntlich nie »nie« sagen, aber es wäre sehr un-wahrscheinlich, da die CLR gründlich getestet wurde und nebenbei selbst-verständlich »unfehlbar« ist). Daraus ergibt sich fast von allein, dass die CLRkeinen Maschinencode ausführt, wie es bei einem normalen Windows-Pro-gramm (und bei Visual Basic 6.0-Programmen, die in nativen Maschinencodekompiliert wurden) der Fall ist. Stattdessen enthält jede Exe- oder DLL-Datei,die von einem .NET-Compiler produziert wurde, Befehle der IntermediateLanguage (kurz IL – prägen Sie sich alle Abkürzungen gut ein, es werdennoch ein paar mehr, wir werden sie am Ende abfragen und wer eine nichtkennt, muss wieder in Visual Basic 6.0 programmieren). Damit lässt sich dieAufgabe der CLR in einem Satz beschreiben: Sie ist für die Ausführung vonIL-Code zuständig. Visual Basic 6.0-Programme kann die CLR übrigens nichtausführen, was aber kein Nachteil ist, denn die CLR ist, wie das komplette.NET-Framework, lediglich eine »Erweiterung« und ersetzt keine bereits vor-handenen Funktionen. Es ist daher auch kein Problem, Visual Basic 6.0- undVisual Basic .NET-Programme auf einem Computer parallel zu betreiben (fallsgewünscht, können sie auch Daten austauschen).

Es wurde bereits erwähnt, dass die CLR während der Laufzeit eines .NET-Programms verschiedene Aktivitäten übernimmt. Dazu gehören im Ein-zelnen:

� Einrichten von so genannten AppDomains, in denen die .NET-Anwen-dung ausgeführt wird. Eine AppDomain ist lediglich ein (logischer) Be-reich, in dem eine .NET-Anwendung ausgeführt wird. AppDomains set-zen auf dem Prozessmodell des Betriebssystems auf und virtualisieren es.Einer .NET-Anwendung ist es »egal«, in welchem Prozess sie läuft, ihreAusführungsumgebung wird durch eine AppDomain definiert. Das Be-triebssystem wiederum sieht nur Prozesse und Threads und weiß nichtsüber AppDomains.

� Verwalten des Arbeitsspeichers (das betrifft vor allem das Anlegen undZerstören von Objekten – diese Aufgabe übernimmt die so genannte Gar-bage Collection, zu Deutsch »Müllbeseitigung«). Die CLR legt alle Objektein einem Arbeitsspeicher an, der als Heap (zu Deutsch »Haufen«) bezeich-net wird. Indem sich die CLR um die Arbeitsspeicherverwaltung kümmertund diese nicht, wie es etwa bei C++ der Fall wäre, dem Betriebssystemüberlässt, nimmt diese sehr viel weniger Zeit in Anspruch. Für VisualBasic-Programmierer ist das Prinzip der automatischen Speicherverwal-tung nicht neu, denn auch die alte Laufzeitumgebung kümmerte sich umdas Freigeben des von einem COM-Objekt belegten Arbeitsspeichers.

Page 52: Jetzt lerne ich Visual Basic.NET  GERMAN

52

Die .NET-Philosophie2� Überwachen der Sicherheitseinstellung vor der Ausführung eines IL-Be-

fehls. Bei .NET lässt sich im Detail festlegen, welcher Befehl unter wel-chen Bedingungen ausgeführt werden darf. Das ist eine der leistungsfä-higsten Eigenschaften der CLR.

� Bereitstellen wichtiger Spracheigenschaften, wie eine strukturierte Aus-nahmebehandlung (das Abfangen von Laufzeitfehlern), Vererbung beiKlassen und Multithreading.

Halten wir fest, die CLR ist die neue allgemeine Laufzeitumgebung für sämt-liche .NET-Programme (sie ersetzt damit unter anderem die DateiMsvbvm60.dll, die Laufzeit-DLL für alle Visual Basic 6.0-Programme).

2.1.2 IL als die neue Maschinensprache

In diesem Abschnitt wird das sehr wichtige Prinzip der Programmausführungeines .NET-Programms erklärt. Sie werden erfahren, dass eine unscheinbareExe-Datei gar keinen Maschinencode enthält, sondern die Befehle einer neu-en und universellen Programmiersprache, und wie sich dieser virtuelle Codedennoch auf einem herkömmlichen Windows-Computer ausführen lässt.Wird ein Visual Basic .NET-Programm kompiliert, ist wie üblich eine Exe-oder DLL-Datei das Resultat. Daran hat sich gegenüber früheren Visual Basic-Versionen nichts geändert. Die Datei besitzt zwar das Standardformat einerausführbaren Datei unter Windows1, so dass sie auch problemlos gestartetwerden kann (anders könnte es auch nicht gehen), enthält aber keinen80x86-Maschinencode. Stattdessen enthält die Datei einen Befehlscode, derals Intermediate Language (IL) bezeichnet wird. Das ist bereits die erste klei-ne Revolution für alle Visual Basic-Programmierer. Visual Basic .NET erzeugt(wie alle anderen .NET-Compiler auch) keinen Maschinencode mehr, sondernstattdessen IL-Code. Dieser IL-Code besteht aus Instruktionen, die von derCLR verstanden werden. Wird ein Visual Basic .NET-Programm zur Ausfüh-rung gebracht, wird als Erstes die CLR geladen, deren Aufgabe darin besteht,den IL-Code Befehl für Befehl auszuführen. Ein Problem gibt es dabei abernoch zu lösen. Sämtliche Prozessoren, die in heutigen Computern enthaltensind, verstehen nur ihren 80x86-Maschinencode und keinen IL-Code. Es istdaher eine weitere Kompilierung erforderlich. Diese Aufgabe übernimmt derso genannte Just In Time-Compiler (JIT) der CLR. Seine Aufgabe bestehtdarin, den IL-Code in ausführbaren Maschinencode zu übersetzen. Die Be-zeichnung »Just In Time« rührt von dem Umstand, dass diese Übersetzung un-mittelbar vor der Ausführung des IL-Codes geschieht, also gerade noch recht-zeitig. Dieser Vorgang wird auch als »jitten« bezeichnet. Wenn .NET-Experten(dazu gehören Sie natürlich auch in Kürze) vom Jitten sprechen, meinen sie

1. Das wiederum sogar auf die ehrwürdigen Zeit von MS-DOS zurückgeht – jede .NET-Exe-Dateibeginnt mit den Buchstaben MZ, dem Namenskürzel jenes Programmierers, der 1980 dieSpeicherverwaltung von MS-DOS programmiert hat.

Page 53: Jetzt lerne ich Visual Basic.NET  GERMAN

53

Was ist .NET?

damit nicht irgendeine neue Extremsportart, sondern lediglich das Überset-zen von IL-Code in einen (im Prinzip beliebigen) Maschinencode. Sowohl dieAnwender als auch die Programmierer des Programms bekommen davonaber nichts mit. Voraussetzung ist lediglich, dass die CLR auf dem Zielcompu-ter vorhanden ist, denn ansonsten kann nichts »gejittet« werden und die Aus-führung der Exe-Datei führt zu einer Fehlermeldung.

Da es so wichtig ist, hier noch einmal eine Wiederholung. .NET-Compiler,wie der Visual Basic .NET-, aber auch der C#-Compiler (Csc.exe), der eben-falls im .NET-Framework-SDK enthalten ist, produzieren grundsätzlich IL-Co-de. Die resultierende Exe- oder DLL-Datei enthält daher keinen Maschinen-code, sondern IL-Code. Mit anderen Worten, die .NET-Compiler erzeugenden Code für eine virtuelle Maschine, die in der CLR enthalten ist1. Vor derAusführung des Programms wird der IL-Code durch den Just In Time-Com-piler der CLR in ausführbaren Maschinencode übersetzt. Ein Geschwindig-keitsnachteil entsteht dadurch nicht.

Visual Basic-Programmierern ist dieses Prinzip nicht ganz neu, denn bereitsfrühere Versionen (bis zur Version 5.0 sogar ausschließlich) produzierten ei-nen Zwischencode (den P-Code), der von der Laufzeit-DLL interpretiert wur-de. Es ist aber wichtig zu verstehen, dass IL-Code nicht interpretiert wird. Erwird in Maschinencode übersetzt, der anschließend ausgeführt wird.

IL-Code ist bei weitem nicht so kompliziert, wie es vielleicht den Anschein ha-ben mag. Es ist eine einfach strukturierte Programmiersprache, bei der einStack, also ein Speicherbereich, auf dem Elemente abgelegt (Push-Operation)oder von dem Elemente genommen werden (Pop-Operation), im Mittelpunktsteht. Mit Hilfe eines Tools mit dem Namen Ildasm.exe aus dem .NET-Fra-mework-SDK lässt sich jede Exe-Datei in IL-Code zurückverwandeln, der ineinem Fenster angezeigt wird (dass sich damit also selbst geschriebene Pro-gramme lesbar machen lassen, ist ein Nachteil der CLR, für den es offenbarim Moment noch keine Lösung gibt). Lohnt es sich, IL zu lernen? Im Prinzipnein. Auch wenn es einige Programmierkunststücke erlaubt, die weder in Vi-sual Basic .NET noch in C# möglich sind (dies betrifft allerdings Spezialitätenwie den dynamischen Aufruf von Programmcode), lohnt sich der Aufwand imAllgemeinen nicht. Wer allerdings wirklich verstehen will, wie der Visual Basic.NET-Compiler funktioniert, oder wer in der Lage sein möchte, Visual Basic.NET und C# zu vergleichen, sollte sich ein wenig mit IL auskennen. IL-Grundkenntnisse können daher nicht schaden, aber kaum jemand wird direktin IL programmieren wollen.

Dennoch soll IL im Folgenden zumindestens einmal gezeigt werden. Listing2-1 enthält ein kleines IL-Programm. Wenn Sie diese Befehle in eine Textda-

1. Mag sein, dass es, wie bereits heute bei Java, eines Tages Prozessoren geben wird, die IL-Code direkt ausführen können.

Page 54: Jetzt lerne ich Visual Basic.NET  GERMAN

54

Die .NET-Philosophie2tei eintippen, mit der Erweiterung .Il abspeichern und mit dem IL-AssemblerIlasm.exe aus dem NET-Framework-SDK in eine Exe-Datei umwandeln, kön-nen Sie das Programm direkt ausführen (vermutlich können Sie sich schondenken, was es macht).

Listing 2-1:IL-Code einmaldirekt – dieses

Programmkann mit demIL-AssemblerIlasm.exe in

eine Exe-Dateiumgewandelt

werden

.assembly Test{}

.class CTest { .method static void Main() { .entrypoint ldstr "Hallo, IL!" call void [mscorlib] System.Console::WriteLine(class System.Object) ret }}

2.2 .NET im Gesamtüberblick

Sie kennen die Rolle der CLR, den wichtigsten Bestandteil von .NET, und Siewissen, dass ein .NET-Compiler keinen Maschinencode wie früher, sondernIL-Code produziert. Allein das würde schon das Attribut revolutionär verdie-nen (zumindestens aus dem Blickwinkel von Microsoft). Hinter .NET stecktaber noch sehr viel mehr. Anstatt wortreicher Erklärungen enthält Abbildung2.1 ein Schaubild (das Ihnen unter Umständen bekannt vorkommen dürfte,da es praktisch bei jeder .NET-Vorführung gezeigt wird). Dieses Schaubildfasst die wichtigsten Bestandteile von .NET zusammen, die im Folgenden kurzerklärt werden. Das alles wird übrigens unter dem Sammelbegriff .NET-Framework zusammengefasst, wobei ein weiterer Begriff, der in Zusammen-hang mit .NET immer wieder fällt, abgehakt wäre.

Das Schaubild lässt sich (erstaunlicherweise) in wenigen Sätzen erklären. Fan-gen wir ganz unten an, wo sich das Betriebssystem befindet. Das Schaubildmacht deutlich, dass .NET nicht nur auf den verschiedenen Windows-Versio-nen (außer Windows 95) aufsetzt, sondern auch für andere Plattformen inFrage kommt. Neben den kleinen Pocket-PCs mit Windows CE als Betriebs-system (für diese Plattform gibt es das .NET Compact Framework) kann diesin Zukunft auch Unix sein (mehr dazu in Kapitel 2.8), wobei dies für VisualBasic .NET-Programmierer keine Alternative ist1. Es ist auch nicht so spekta-kulär, denn auch DCOM wurde bereits vor Jahren auf andere Plattformenportiert, ohne dass dies ein Entwickler mitbekommen hätte. Bewegen wir unsauf die nächste Ebene. Hier treffen wir die verschiedenen Komponenten der

Buch-CD: HalloWelt.il

1. Zum Zeitpunkt der Drucklegung war die von Microsoft angekündigte Implementierung derCLI für FreeBSD Unix noch nicht verfügbar.

Page 55: Jetzt lerne ich Visual Basic.NET  GERMAN

55

.NET im Gesamtüberblick

Common Language Runtime (CLR) an, wie das Common Type System, dieGarbage Collection und die Code Access Security (CAS). Dies sind die »Ar-beiter« der CLR, die unermüdlich im Einsatz sind, sobald die erste .NET-An-wendung gestartet wurde. Mit dabei ist natürlich auch der JIT-Compiler (denes sogar in verschiedenen Ausführungen gibt), der aber in dem Schaubildnicht zu sehen ist. Oberhalb der CLR befinden sich die überaus umfangrei-chen Basisklassen, sozusagen das .NET-Framework. Sie sind ein wichtigerBestandteil der Laufzeitumgebung, da sie permanent sowohl von den .NET-Anwendungen als auch von der CLR benötigt werden. Anders als früher sindes keine statischen Funktionsbibliotheken, die einmal hinzugebunden werden.Es handelt sich um DLLs, die von der Anwendung, die sie benötigt, geladenwerden und erst dann wieder entfernt werden, wenn sie keine .NET-Anwen-dung mehr benötigt. Nicht zu sehen in dem Schaubild ist der Umstand, dassjede .NET-Anwendung in ihrem eigenen Bereich, der so genannten AppDo-main, läuft. Eine AppDomain definiert einen logischen Bereich, in dem einAssembly ausgeführt wird und der unter anderem über eigene Sicherheitsein-stellungen verfügt. Es ist die Aufgabe der CLR, für jede .NET-Anwendung ineinem Prozess AppDomains einzurichten. Gehen wir in dem Schaubild eineEbene nach oben, kommen wir zur Ebene des verwalteten Codes. Dies ist imGrunde keine eigene Ebene, der Kasten soll lediglich andeuten, dass die CLRausschließlich verwalteten Code ausführt. An oberster Stelle des Schaubildsbefinden sich schließlich die Anwendungen, die Sie mit Visual Basic .NET, C#oder jeder anderen .NET-Programmiersprache erstellen (insgesamt gibt esweit über 20, wobei es sich bei vielen eher um Fallstudien aus dem akademi-schen Bereich handelt). Das war .NET im Schnelldurchgang. War doch garnicht so kompliziert, oder?

Abb. 2.1:Das .NET-Framework im Überblick

Page 56: Jetzt lerne ich Visual Basic.NET  GERMAN

56

Die .NET-Philosophie2

2.3 Die Datentypen des Common Type System (CTS)

Die CLR arbeitet mit einem einheitlichen Satz an Datentypen, die unter demNamen Common Type System (CTS) zusammengefasst werden. Es war stetsein Problem früherer Versionen, dass jede Programmiersprache mit eigenenDatentypen arbeitete. Für Visual Basic-Programmierer macht sich dies vor al-lem dann negativ bemerkbar, wenn es um den Aufruf von API-Funktionenging, deren Datentypen von C/C++ stammten. Wer schon einmal darübernachgegrübelt hat, welche Visual Basic-Datentypen für einen lpzs-Parameteroder einen Functionpointer eingesetzt werden müssten, oder wer festgestellthat, dass eine API-Funktion nicht aufgerufen werden konnte, weil sie vorzei-chenlose Datentypen erwartete, wird das CTS mehr als begrüßen. Zwar wur-de mit dem Component Object Model (COM) bereits ein einheitlicher Satzvon Datentypen eingeführt, doch nur als Erweiterung der bereits vorhande-nen Datentypen für den Fall, dass Daten über COM zwischen Anwendungenausgetauscht werden sollten. Die CTS-Datentypen stellen dagegen den einzi-gen Satz an Datentypen dar, der für jede Programmiersprache maßgeblich ist.Tabelle 2.1 enthält eine Übersicht über die CTS-Datentypen und verrät auch,welche Namen dafür in Visual Basic .NET verwendet wurden (um die Pro-grammierer nicht mehr als nötig zu verwirren, wurden viele Namen beibe-halten – dahinter stecken aber stets die CTS-Datentypen).

Wie immer muss zwischen Theorie und Praxis unterschieden werden. DasCTS bedeutet nicht, dass alle Programmiersprachen exakt die gleichenDatentypen benutzen. Zum einen kann jede Programmiersprache eigeneNamen verwenden – der Datentyp Single heißt in C# zum Beispiel Float, derDatentyp String heißt in C# string, was besonders subtil ist, da C# zwischenGroß- und Kleinschreibung unterscheidet. Der Datentyp Int16 heißt beiVisual Basic .NET Short. Zum anderen, und das ist viel wichtiger, kann jedeProgrammiersprache weitere Datentypen besitzen, die nicht Teil des CTSsind. Bei C# wären das zum Beispiel die vorzeichenlosen Datentypen, wieetwa uint. Das CTS stellt daher den kleinsten gemeinsamen Nenner dar, dervon allen .NET-Programmiersprachen unterstützt wird1. Bei Visual Basic.NET ist jeder Datentyp gleichzeitig auch ein CTS-Datentyp, bei anderen.NET-Programmiersprachen muss dies nicht der Fall sein.

1. Besser unterstützt werden sollte. Niemand kann einen Programmierer, der sich eine neue.NET-Sprache ausdenkt, zwingen, alle CTS-Datentypen zu unterstützen. Es wird aber prak-tisch immer der Fall sein, da es keinen Sinn ergibt und nur zu unnötigen Komplikationenführt, dies nicht zu tun.

Page 57: Jetzt lerne ich Visual Basic.NET  GERMAN

57

Die Datentypen des Common Type System (CTS)

Tabelle 2.1:Die .NET-Datentypen des Common Type System im Überblick

Wer sich Tabelle 2.1 genauer anschaut, wird sich vermutlich fragen, was derganze Aufwand und die Gegenüberstellung zwischen CTS- und Visual Basic.NET-Datentypen soll, da doch praktisch alle CTS-Datentypen namensgleichmit den Visual Basic .NET-Datentypen sind (sieht man von dem Namenszu-satz System ab, da sich alle Datentypen von der System.Object-Klasse ablei-ten). Doch das ist genau der Punkt, auf den man am Anfang nicht oft genugverweisen kann. Die Namensgleichheit rührt gerade von dem Umstand her,dass Visual Basic .NET 1:1 die CTS-Datentypen übernimmt und lediglich klei-nere Namensänderungen vornimmt, damit es erfahrene Visual Basic-Pro-grammierer am Anfang ein wenig leichter haben. Es ist jedoch überhaupt keinProblem (und manchmal auch empfehlenswerter), statt der Visual Basic-Alia-se die »wahren« Namen zu verwenden.

3Die folgenden beiden Befehle definieren zwei Variablen mit dem exakt glei-chen Datentyp, nur dass einmal ein Visual Basic .NET-Alias, das andere Malder CTS-Name verwendet wird.

Dim Zahl1 As ShortDim Zahl2 As System.Int16

Die zweite Variante bietet den Vorteil, dass sie einheitlicher und aussagekräf-tiger ist. Programmierer, die sich am Anfang nicht sicher sind, ob ein Longnun 32 oder 64 Bit umfasst, sollten daher die CTS-Datentypen benutzen. Dasmacht den Quelltext unter Umständen ein wenig besser lesbar und vermeidetauch beim Aufruf von API-Funktionen (für den es allerdings bei Visual Basic.NET seltener eine Notwendigkeit geben dürfte als früher) Missverständnisse,denn für einen Long-Datentyp muss bei Visual Basic .NET ein Integer über-geben werden.

Datentyp Bedeutung Visual Basic .NET-Alias

System.Byte 8 Bit vorzeichenlos Byte

System.Char 1 Unicode-Zeichen (16 Bit) Char

System.Int16 16 Bit mit Vorzeichen Short

System.Int32 32 Bit mit Vorzeichen Integer

System.Int64 64 Bit mit Vorzeichen Long

System.Single 32 Bit-IEEE-Fließkommaformat Single

System.Double 32 Bit-IEEE-Fließkommaformat Double

System.Decimal 128 Bit-Fließkommaformat Decimal

System.Boolean True/False-Wert (16 Bit) Boolean

System.String Array von Unicode-Zeichen String

System.Object Universeller Datentyp Object

Page 58: Jetzt lerne ich Visual Basic.NET  GERMAN

58

Die .NET-Philosophie2

2.4 Die .NET-Basisklassen

Nun zu einem sehr angenehmen Thema, das angehende .NET-Programmie-rer meistens (eigentlich immer) mit zunehmender Praxiserfahrung von mögli-cherweise anfänglicher Skepsis zu echter Begeisterung hinreißen lässt. DieRede ist von den .NET-Basisklassen, die eine weitere Grundsäule des .NET-Framework darstellen. Wenn .NET weitestgehend unabhängig von einem Be-triebssystem sein soll, muss es einen großen Teil der API des Betriebssystemszur Verfügung stellen. Das reicht von simplen Dingen, wie Funktionen für denDateizugriff, bis hin zu komplexen Dingen, wie einer kompletten (und zudemsehr anspruchsvollen) Fensterverwaltung. Diese Herausforderung musste be-reits bei Java gelöst werden, das seinem Anspruch »einmal schreiben, überalllaufen« nur gerecht werden konnte, indem es alles das, was Programmierer anzusätzlichen Funktionen benötigen, über eine Klassenbibliothek zur Verfü-gung stellt. Und genauso verhält es sich bei .NET. Mit den .NET-Basisklassenexistiert eine überaus umfangreiche Klassenbibliothek, die 90% aller Funktio-nen enthält, die Programmierer jemals benötigen werden. Die restlichen 10%sind nicht vorhanden, weil sie entweder noch nicht implementiert wurden (fürdiesen Fall müssen Programmierer wieder auf die API-Funktionen von Win-dows zurückgreifen) oder weil sie nicht benötigt werden. So gibt es im Rah-men der .NET-Basisklassen keine Low-Level-Funktionen, etwa für den Hard-warezugriff oder für das Allokieren von Speicherblöcken, da dies entwedernicht zur .NET-Philosophie passen würde oder diese Aufgabe von der CLRübernommen wird und die Programmierer davon die Finger lassen sollen1.

2.4.1 Die Rolle der Namensräume

Bevor Sie einige Vertreter der Basisklassen kennen lernen, müssen Sie nocheinen Begriff über sich ergehen lassen, den Sie an vielen Stellen in diesemBuch wiederfinden werden und der am Anfang alles andere als leicht ver-ständlich erscheinen wird. Sind Sie bereit? Es geht um den Namensraum(engl. »namespace«). Namensräume sollen die Basisklassen übersichtlicher ge-stalten. Stellen Sie sich vor, Sie wären der Chef (oder die Chefin) einer Firmamit etwas über 7.000 Angestellten (so viele Basisklassen gibt es in etwa). Stel-len Sie sich weiter vor, sie sollten die Namen aller Angestellten auf ein (grooo-ßes) Blatt Papier schreiben (es gibt keine Computer, auch wenn dies schwervorstellbar erscheint). Nun würde es wenig Sinn ergeben, alle Namen unter-einander oder nebeneinander zu schreiben, denn das wäre extrem unüber-sichtlich und es wäre praktisch aussichtslos einen bestimmten Namen zu fin-den. Es ergibt sich praktisch von alleine, die Angestellten auf ihre Abteilungen

1. Programmierer, die gerne einzelne Bits umdrehen oder direkt an der Hardware programmie-ren, werden mit .NET wenig Spaß haben. Diese Programmierer gehören allerdings bereitsheute einer aussterbenden Spezies an.

Page 59: Jetzt lerne ich Visual Basic.NET  GERMAN

59

Die .NET-Basisklassen

zu verteilen. Sie malen erst einen großen Kreis und geben diesem den NamenVertrieb. Dann malen Sie in diesen Kreis einen weiteren Kreis mit dem Na-men Innendienst und einen weiteren mit dem Namen PLZ-Gebiet 1-2. In die-sen Kreis schreiben Sie jetzt die Namen aller Mitarbeiter in dieser Abteilung.Wenn es in dieser Abteilung einen Mitarbeiter namens Schröder gibt, ent-steht ein weiteres Problem. In der Firma kann es natürlich viele Schröder ge-ben, Schröder allein wäre noch nicht ausreichend (auch Gerhard als Vornamenicht). Um den Mitarbeiter eindeutig zu bezeichnen, beginnen Sie in derKreishierarchie ganz oben und schreiben nacheinander die Namen aller Krei-se auf, bis Sie zu dem Namen des Angestellten gelangen. Der Name des Mit-arbeiters lautet daher in dieser speziellen Schreibweise: \FirmaMeg-aAG\Vertrieb\Innendienst\PLZ12\Schröder. Damit lässt sich der Namedes Mitarbeiters eindeutig beschreiben1.

Bei den Basisklassen ist es ähnlich. Damit die Übersicht erleichtert und vor al-lem, damit Klassennamen mehrfach vorkommen dürfen, sind die gesamtenBasisklassen in Namensräume unterteilt. Da gibt es einen ObernamensraumSystem und in diesem eine Reihe von Unternamensräumen, wie Console,Text oder Xml. Jeder dieser Namensräume enthält Klassen und gegebenen-falls weitere Namensräume. Möchten Sie zum Beispiel die Klasse FileStreamim Namensraum System.IO ansprechen, so lautet ihr offizieller Name: Sys-tem.IO.FileStream. Sie finden daher in manchen Visual Basic .NET-Pro-grammen einen Befehl wie:

Dim obFi As New System.IO.FileStream("Test.dat", _ System.IO.FileMode.Open)

Das sieht etwas kompliziert aus. Ist es aber nicht, denn hier wird lediglich dieKlasse FileStream mit ihrem kompletten Namensraum angesprochen, wobeidies auch für die Konstante FileMode gilt, da sie ebenfalls in diesem Namens-raum enthalten ist). Allerdings darf man nicht so ohne weiteres den Namens-raum weglassen und stattdessen

Dim obFi As New FileStream("Test.dat", FileMode.Open)

schreiben. Das geht nur dann, wenn der Namensraum zuvor über den Im-ports-Befehl im Programm bekannt gemacht wurde:

Imports System.IO

Doch das wäre an dieser Stelle bereits zu weit vorgegriffen. Den Imports-Be-fehl von VisualBasic .NET lernen Sie in den folgenden Kapiteln ausführlicherkennen. Dort wird auch noch einmal, da es so wichtig ist, das Thema der Na-mensräume aufgegriffen.

1. Fällt Ihnen etwas auf? Richtig, in der Abteilung kann es natürlich auch mehrere Schrödersgeben – doch gehen wir für einen Moment davon aus, dass dies illegal ist.

Page 60: Jetzt lerne ich Visual Basic.NET  GERMAN

60

Die .NET-Philosophie22.4.2 Die .NET-Basisklassen in der Praxis

Einen halbwegs vollständigen Überblick über die .NET-Basisklassen zu geben,ist weder machbar noch sinnvoll. Es ist nicht machbar, weil es weit über 7.000Klassen (sie werden unter dem Begriff Typen verallgemeinert) gibt, es ist nichtsinnvoll, da alles wunderschön in der Dokumentation des .NET-Framework-SDK beschrieben ist, die jedem (!) Programmierer frei zugänglich ist. Andersals in der Vergangenheit ist das .NET-Framework vollkommen programmier-sprachenneutral, wenngleich es bei den Beispielen ein leichtes Übergewichtfür C# gibt1. Auch das ist eine kleine Revolution für Visual Basic-Programmie-rer. Möchten Sie etwas über eine bestimmte Basisklasse wissen, drücken Sie(in Visual Studio .NET) einfach die É-Taste oder stöbern Sie in der umfang-reichen Dokumentation des .NET-Framework-SDK. Nie wieder suchen im In-ternet und nie wieder frustriert feststellen müssen, dass man C++-Program-mierer sein müsste, um irgendeine »coole« Funktion benutzen oderzumindestens verstehen zu können.

Abb. 2.2:In der Doku-

mentation des.NET-Frame-

work-SDK wer-den alle .NET-

Basisklassenbeschrieben

Dass sich die Basisklassen nicht vorstellen lassen, bedeutet natürlich nicht,dass Sie sich ein weiteres Buch zulegen müssen. In praktisch jedem Beispielkommen Basisklassen vor, denn anders kann man nicht programmieren. Ka-pitel 6.10 fasst die Rolle der Basisklassen in einem etwas umfangreicherenBeispiel zusammen. Hier bereits ein kleiner Vorgeschmack, der vor allem zei-gen soll, dass die .NET-Basisklassen keine Erweiterung, sondern ein festerBestandteil eines jeden .NET-Programms sind.

3Das folgende Beispiel legt ein neues Unterverzeichnis in Eigene Dateien an,dessen Name zuvor eingegeben wurde.

1. Kein Wunder, da ein Großteil der .NET-Basisklassen in C# programmiert wurde.

Page 61: Jetzt lerne ich Visual Basic.NET  GERMAN

61

Die .NET-Basisklassen

Listing 2-2:Anlegen eines Verzeichnisses mit den .NET-Basisklassen

' -----------------------------------------------' Kleines Beispiel für den Umgang mit den .NET-' Basiklassen' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------Imports System

Class App

Shared Sub Main() Console.Write("Bitte Verzeichnisname eingeben: ") Dim stPfad As String = Console.ReadLine() If stPfad = "" Then Environment.Exit(255) Dim stMyDocPfad = Environment. _ ExpandEnvironmentVariables("%Userprofile%") & _ "\Eigene Dateien" Try Io.Directory.CreateDirectory(stMyDocPfad & "\" & _ stPfad) Console.WriteLine("Verzeichnis wurde angelegt!") Catch ex As Exception Console.WriteLine(ex.Message) End Try Console.ReadLine()End Sub

End Class

Haben Sie bereits entdeckt, wo in dem kleinen Visual Basic .NET-Programmdie .NET-Basisklassen im Spiel sind? Nun, es ist natürlich nicht ganz einfach,denn man sieht es einem Namen nicht an, ob es sich um einen Befehl odereinen Methodenaufruf einer .NET-Basisklasse handelt. Im obigen Beispielwurde allerdings eine Besonderheit eingebaut, die das Erkennen der Klassendeutlich erleichtert. Da auf das Importieren weiterer Namensräume verzichtetwird, muss jedem Methodenaufruf der Klassenname vorangestellt werden.Damit lässt sich zum Beispiel erkennen, dass es sich in dem Befehl

If stPfad = "" Then Environment.Exit(255)

bei Environment.Exit um den Aufruf eine Methode (Funktion) einer .NET-Basisklasse handelt, wobei Environment die Klasse und Exit die Methode ist.Was bei früheren Versionen von Visual Basic eingebaute Funktionen waren,sind bei Visual Basic .NET ausschließlich die Methoden (Funktionen) der.NET-Basisklassen. Die Programmierung wird dadurch aber einfacher, da dieBasisklassen einheitlicher sind und vor allem ein Vielfaches an Möglichkeitenbieten.

Buch-CD: vbnet0202.vb

Page 62: Jetzt lerne ich Visual Basic.NET  GERMAN

62

Die .NET-Philosophie2Merken Sie sich bitte, dass Sie nichts deklarieren müssen, um eine .NET-Ba-sisklasse benutzen zu können. Sie schreiben einfach den Namen der Klassehin oder verwenden direkt die Methode oder Eigenschaft. Ob Sie den voll-ständigen Klassennamen (inklusive des Namensraums) verwenden müssenoder ob es genügt, den Namen der Methode zu schreiben, hängt lediglich da-von ab, ob über den Imports-Befehl ein Namensraum vereinbart wurde. Essei an dieser Stelle bereits erwähnt, dass der Imports-Befehl nichts wirklichimportiert (etwa eine .NET-Klassenbibliothek), sondern lediglich eine Abkür-zung für das Schreiben der teilweise etwas umfangreichen Namensraum- undKlassennamen bietet. Mehr zu diesem Befehl in Kapitel 10.11.

Tabelle 2.2:Wichtige

Namensräumeim System-

Namensraumim Überblick

2.5 Die Rolle der Assemblies

In diesem Abschnitt lernen Sie einen weiteren Begriff kennen, mit dem Sie inein paar Wochen genauso selbstverständlich umgehen werden wie heute mitBegriffen wie Steuerelement oder auch Betriebssystem. (Vielleicht haben Sienoch in Erinnerung, wie ungeheuer kompliziert und abstrakt diese Begriffeam Anfang erschienen sind.) Bei .NET spricht man nicht so sehr von Pro-grammen, sondern vielmehr von Assemblies. Ein Assembly1 ist eine logischeEinheit, in der .NET-Programme ausgeliefert und »versioniert« (das heißt miteiner Versionsnummer versehen) werden. Soviel zur offiziellen Definition,nun zu einer verständlicheren Erklärung. Im einfachsten Fall besteht ein As-sembly lediglich aus einer Exe- oder einer DLL-Datei. Praktisch alle Beispiele,die in diesem Buch vorgestellt werden, ergeben nach der Kompilierung ein

Namensraum Was wird geboten?

Xml Zugriff auf XML-Dateien über das Document Object Model (DOM).

Collections.Specialized Stellt eine Reihe spezialisierter Arrays und Collections zur Verfügung.

Diagnostics Stellt unter anderem PerformanceCounter-Klassen zur Verfügung, mit deren Hilfe sich die Performance eines Programms detailliert ermitteln lässt.

IO Enthält Klassen für den Datei- und Verzeichniszugriff.

Net Enthält Klassen für die Netzwerk- und Internetprogram-mierung.

Text.RegularExpressions Umfangreiche Klassen für die Auswertung regulärer Aus-drücke.

Threading Unterstützung für das Multithreading.

1. Der Begriff lässt sich vermutlich am besten mit »Versammlung« (von Dateien und Typen) über-setzen.

Page 63: Jetzt lerne ich Visual Basic.NET  GERMAN

63

Die Rolle der Assemblies

Assembly, das aus lediglich einer Datei besteht. In diesem Fall sind Assemblyund das, was normalerweise als Programm bezeichnet wird, identisch. Es istjedoch auch denkbar (in erster Linie bei etwas größeren Projekten), dass einAssembly aus mehreren Dateien besteht. Das können Klassenbibliothekensein, die von der Exe-Datei angesprochen werden. Das können aber auchBitmaps, Sounddateien und andere Ressourcendateien sein. Es kann sichaber auch um Dateien handeln, die sich auf einem Webserver befinden undbeim ersten Start des Programms erst einmal heruntergeladen werden müs-sen. Ein Assembly ist damit eine Zusammenstellung von im Prinzip beliebigenDateien, die von der CLR als eine (logische) Einheit behandelt wird. Dabeikommt es aber nicht nur auf den Umstand an, dass alle Dateien unter einemSammelnamen (dem Assembly-Namen, der stets pfadunabhängig ist) zusam-mengefasst werden. Sehr viel wichtiger ist der Umstand, dass ein Assemblyeine Versionsnummer besitzt, anhand derer die CLR das Assembly passendzu einem anderen Assembly zuordnen kann.

Assemblies sind, anders als Exe- oder DLL-Dateien bei früheren Visual Basic-Versionen, selbst beschreibend (es gibt bei .NET weder Typenbibliothekennoch irgendwelche Registrierungseinträge – die Registrierung spielt vielmehrgar keine Rolle). Jedes Modul (aus denen sich später ein Assembly zusammen-setzt) enthält eine Beschreibung seines Inhalts (in Textform). Handelt es sichbei dem Modul um ein Programmmodul (und um eine Ressourcendatei), um-fasst die Beschreibung die Namen aller Typen, die in dem Modul enthaltensind. Darüber hinaus enthält genau ein Modul eine vollständige Beschreibungder Struktur des kompletten Assembly, eine Art Inhaltsverzeichnis. Dieseswird als Manifest bezeichnet und wird zum Beispiel von dem SDK-ToolIldasm.exe angezeigt, wenn dieses mit dem Namen des Assembly aufgerufenwird. Am Anfang müssen Sie sich nicht mit diesen Details beschäftigen. IhreProgramme bestehen in der Regel aus einer einzigen Quelltextdatei. Sie kom-pilieren diese in ein Modul vom Typ Exe, das gleichzeitig das Assembly dar-stellt (die Alternative wäre, die Quelltextdatei zunächst in ein Modul zu kom-pilieren, das dann aber nicht eigenständig aufgerufen werden kann, sondernnur Teil eines anderen Assembly sein kann). Sie kümmern sich weder um De-tails, Metadaten noch um Manifeste. Dennoch ist es interessant und lehrreich,einmal einen Blick in ein solches Manifest zu werfen. Verwenden Sie dazuzum Beispiel das Assembly HalloVb.exe, das als erstes kleines Beispiel inKapitel 1 entstand. Wechseln Sie in die Eingabeaufforderung und rufen SieIldasm.exe wie folgt auf:

ildasm hallovb.exe

Es öffnet sich ein kleines Fenster (die Ausgabe lässt sich auch in die Eingabe-aufforderung umleiten), in dem die Struktur des Assembly angezeigt wird. Kli-cken Sie den Eintrag Manifest doppelt an, um das Manifest in einem weiterenFenster anzuzeigen. Das Manifest ist eine Textbeschreibung, die mit ein wenig

Page 64: Jetzt lerne ich Visual Basic.NET  GERMAN

64

Die .NET-Philosophie2Erfahrung im Umgang mit .NET alles andere als kompliziert ist. So erfahrenwir aus dem Manifest (siehe Abbildung 2.3) unter anderem, dass das Assem-bly zwei externe Assemblies anspricht (mscorlib – dies ist das Kern-Assemblyder .NET-Basisklassen – sowie das Assembly, das die Microsoft.VisualBasic-Kompatibilitätsklasse enthält und das irgendwie in das Programm geraten ist).Weiterhin erfahren wir, dass unser Assembly HalloVb heißt (das ist nichtsNeues), dass es keine Versionsnummer besitzt (diese lautet 0.0.0.0) und dasses aus dem Modul HalloVb.exe (dem eigentlichen Programm) besteht.

Abb. 2.3:Das Manifest

des Hallo,Welt-Pro-

gramms ausKapitel 1 zeigt

die Strukturdes Assembly

an

Bliebe noch zu erwähnen, dass auch sämtliche .NET-Basisklassen als Assem-blies vorliegen. (Sie finden sie unter anderem im Verzeichnis %system-root%\Microsoft.NET\Framework\v1.0.3317, wobei das letzte Verzeich-nis von der aktuellen Versionsnummer abhängt und es daher auch keinProblem ist, sich ihren Inhalt mit Ildasm.exe im Detail anzuschauen.) Möch-ten Sie einmal einen Blick in das Assembly Microsoft.VisualBasic.DLL wer-fen? Dieses enthält die Visual Basic-Kompatibilitätsklasse mit den Funktionenund Konstanten früherer Visual Basic-Versionen, um so die Kompatibilität zudiesen Versionen herzustellen. Wechseln Sie in das Verzeichnis und rufen SieIldasm.exe wie folgt auf.

ildasm microsoft.visualBasic.dll

Sie sehen nun den IL-Code jeder einzelnen Methode und können im PrinzipSchritt für Schritt nachvollziehen, wie sie funktioniert. Das ist das Faszinieren-de und Schöne an .NET. Alles ist sehr einheitlich und größtenteils durch sichselbst definiert und daher sehr logisch aufgebaut.

Page 65: Jetzt lerne ich Visual Basic.NET  GERMAN

65

Die Rolle der Assemblies

Abb. 2.4:Ein direkter Blick in die Mi-crosoft.Visual-Basic-Kompati-bilitätsklasse

2.5.1 Starke Namen, schwache Namen

Assemblies könnten nicht die teilweise sehr komplexen und vertrackten Pro-bleme der Versionierung lösen, indem sie lediglich (über ihre Metadaten unddas obligatorische Manifest) selbstschreibend sind und Microsoft alle Pro-grammierer ermahnen, künftig etwas sorgfältiger zu sein. Es gibt noch eineweitere »magische« Zutat, die Sie in diesem Abschnitt kennen lernen werden.Zunächst muss vorangestellt werden, dass sich Assemblies nicht durch ihrenVerzeichnispfad auszeichnen, den sie zwar besitzen (alternativ kann es aberauch eine URL sein), der aber nicht zur Unterscheidung herangezogen wird.Ein Assembly besitzt lediglich einen einfachen Namen (der in Regel mit demDateinamen der Exe- oder DLL-Datei identisch ist). Da dieser Name abernicht eindeutig sein kann, gibt es noch einen zweiten Namen. Dieser wirdstarker Name (engl. »strong name«) genannt und besteht aus einer Kombina-tion aus einem privaten und einem öffentlichen Schlüssel. Dieses Namens-paar erfüllt zwei Aufgaben: Es gibt dem Assembly einen eindeutigen, unver-wechselbaren Namen (ähnlich der GUID einer COM-Komponente) und esstellt gleichzeitig die digitale Unterschrift des Entwicklers bzw. der Entwick-lungsfirma dar. Wird ein Assembly digital signiert, kann es nicht mehr modi-fiziert werden (etwa durch einen Virus), da dies die interne Prüfsumme bre-chen und bei der Ausführung erkannt werden würde. Gleichzeitig kann einAdministrator (oder wer immer sich dafür interessiert und in Besitz des dazu-

Page 66: Jetzt lerne ich Visual Basic.NET  GERMAN

66

Die .NET-Philosophie2gehörigen öffentlichen Schlüssels ist) feststellen, dass ein Assembly von einerbestimmten Person stammt und ihm nicht von irgendjemandem untergejubeltwurde, der vorgibt der Entwickler zu sein, es aber in Wirklichkeit gar nicht ist.

Der starke Name wird aber nicht für alle Assemblies benötigt. Es gibt vielmehrzwei »Sorten« von Assemblies: jene, die in ein beliebiges Verzeichnis kopiertwerden. Hier geht die CLR einfach davon aus, dass es in dem Verzeichnis nurein Assembly mit einem bestimmten Namen gibt, was eine durchaus vernünf-tige Annahme ist. Möchten Sie also erreichen, dass ein Assembly auf einemanderen Computer ausführen kann (auf dem sich natürlich die .NET-Laufzeit-dateien befinden müssen), kopieren Sie die Exe-Datei einfach in irgendeinVerzeichnis und führen Sie sie dort aus. Eine Registrierung (denken Sie daran,die Registry spielt für .NET-Programme keine Rolle) oder Installation ist nichtnotwendig (Microsoft bezeichnet diese Form der Auslieferung auch als »XCo-py-Installation«, da es im Prinzip genügt, alle beteiligten Dateien über denXCopy-Befehl in das Verzeichnis zu kopieren). Soll die Datei wieder »deinstal-liert« werden, genügt es, das Verzeichnis zu löschen. Diese Assemblies werdenals private Assemblies bezeichnet. Sie können einen starken Namen besit-zen, müssen es aber nicht (und tun es vermutlich auch in der Vielzahl der Fällenicht).

Das Problem der Versionierung wird durch die Assemblies mit einem so ge-nannten schwachen Namen aber nicht gelöst. Soll ein Assembly von mehre-ren anderen Assemblies benutzt werden (es wird in diesem Fall auch als»shared Assembly«, was sich mit gemeinsam nutzbar übersetzen lässt, be-zeichnet), darf es sich nicht in irgendeinem Verzeichnis aufhalten, es musssich vielmehr in einem ganz bestimmten Verzeichnis befinden. Dieses Ver-zeichnis wird als Global Assembly Cache (GAC) bezeichnet (auch wenn derphysikalische Pfad im Allgemeinen keine direkte Rolle spielt, handelt es sichum das Unterverzeichnis Assembly im %systemroot%-Verzeichnis). Im GAChalten sich alle shared (öffentlichen) Assemblies auf. Nicht nur die des .NET-Framework, sondern auch die, die von Anwendungen bei der Installation ein-gefügt wurden, damit sie von anderen Assemblies (die sich in ihrem privatenVerzeichnis befinden können) aufgerufen werden können. Wenn Sie sich denInhalt des GAC auf Ihrem Computer ansehen möchten, wechseln Sie die Ein-gabeaufforderung und geben Sie folgenden Befehl ein:

gacutil /l

Möchten Sie die umfangreiche Ausgabe in eine Datei umleiten, die Sie sichspäter mit Notepad anschauen können, geben Sie den folgenden Befehl ein:

gacutil /l > gac.txt

Gacutil ist ein Tool aus dem .NET-Framework SDK für den Zugriff auf denGAC. Am Anfang werden es noch relativ wenige Assemblies sein (auf mei-nem Computer sind es 116), doch je mehr .NET-Anwendungen Sie installie-

Page 67: Jetzt lerne ich Visual Basic.NET  GERMAN

67

Die Rolle der Assemblies

ren, desto mehr Assemblies treffen im GAC ein. Ein »richtiges« .NET-System,bei dem nicht nur alle größeren Anwendungen (mit Sicherheit wird es einesTages auch ein .NET Office geben), sondern auch das Betriebssystem auf.NET basiert, dürfte Tausende von Assemblies enthalten1.

Damit aber, und jetzt kommt der springende Punkt, ein Assembly in den GACaufgenommen werden kann, muss es einen starken Namen tragen, den ihmder Entwickler (mehr dazu gleich) verliehen hat. In diesem Fall spielt es näm-lich keine Rolle, ob zwei oder mehr Assemblies den gleichen (schwachen) Na-men tragen. Die CLR unterscheidet sie anhand ihres starken Namens, der un-ter anderem voraussetzt, dass die Assemblies eine Versionsnummer tragen,anhand derer sie von anderen Assemblies unterschieden werden können.

1

Abbildung 2.5 zeigt den Inhalt des GAC, wie er durch den Explorer angezeigtwird.

Abb. 2.5:Ein Blick in den Global As-sembly Cache (GAC) – hier halten sich alle öffentlichen Assemblies auf, die alle ei-nen starken Namen besit-zen

1. Und vermutlich einen 3,5-GHz-Prozessor mit 3 Gbyte RAM voraussetzen.

Die Bezeichnung »starker Name« hätte man vielleicht besser mit »eindeutigerName« übersetzen sollen. Es ist die 1:1-Übersetzung von »strong name«. DerName ist nicht stark, weil sich jemand einen besonders tollen Namen ausge-dacht hat, er ist stark in Bezug auf die Verschlüsselung und damit die Un-möglichkeit einer Verwechslung. Je stärker ein Schlüssel, desto schwierigerist es, ihn zu knacken. Je stärker ein Name, desto schwieriger ist es, ihn zuverwechseln.

Page 68: Jetzt lerne ich Visual Basic.NET  GERMAN

68

Die .NET-Philosophie2Der Umstand, dass die Spalten die Eigenschaften eines Assemblies wie dieVersionsnummer oder die CultureInfo (die Landeseinstellung) anzeigen, rührtdaher, dass mit dem .NET-Framework auch eine kleine Explorer-Erweiterunginstalliert wird. Würden Sie sich den Inhalt des GAC in der Eingabeaufforde-rung anschauen, würden Sie den »wahren« Inhalt sehen, der Ihnen aber nichtviel verraten würde.

Zum Schluss dieses hoffentlich sehr interessanten Abschnitts (der Umgangmit Assemblies ist das A und O der .NET-Programmierung – die genialstenProgrammiertricks haben keinen Wert, wenn sich das Assembly, das sie ent-hält, nicht flexibel ausliefern lässt) sollen Sie erfahren, wie ein Assembly inden GAC installiert wird, wie es einen starken Namen erhält und wie sich dieso wichtige Versionsnummer zusammensetzt und einem Assembly zugeord-net wird.

In Kapitel 2.6.5 wird eine kleine C#-Klasse vorgestellt, die von einem VisualBasic .NET-Programm angesprochen wird. Die Klasse ist Teil der DateiFak.dll (es geht um Fakultätsberechnung und um nichts anderes). In diesemAbschnitt wird einfach davon ausgegangen, dass sich die DLL im gleichenVerzeichnis befindet wie das Visual Basic .NET-Programm (bzw. in einem je-ner Verzeichnisse, die automatisch vom Compiler durchsucht werden). Eshandelt sich bei Fak.dll daher um ein privates Assembly. Doch das dürfte inder Praxis eher die Ausnahme sein. Wir wollen natürlich alle Freiheiten genie-ßen und es soll keine Rolle spielen, ob sich das Assembly Fak.dll mehrfachphysikalisch auf dem Computer aufhält (ansonsten erhielte der Dateinamevielleicht doch eine erweiterte Bedeutung). Wie lässt sich das erreichen? DasKopieren in das Verzeichnis Assembly kommt zunächst nicht in Frage (auchwenn das Ziehen und Ablegen von Assemblies in das GAC-Verzeichnis mitdem Explorer grundsätzlich möglich ist), da dies einen starken Namen voraus-setzt, der im Moment noch nicht vorhanden ist. Das Installieren eines Assem-bly in den GAC besteht vielmehr aus einer Folge von Schritten:

Schritt 1 Über das Tool Sn.exe aus dem .NET-Framework SDK wird eine so genannteSchlüsseldatei erzeugt, die einen privaten und einen öffentlichen Schlüsselenthält. Der private Schlüssel muss unter Verschluss gehalten werden, da erfür die »Identität« des Entwicklers steht. Der öffentliche Schlüssel befindet sichdagegen im Umlauf, da er von allen benötigt wird, die auf das öffentliche As-sembly zugreifen möchten.

Schritt 2 Mit der Schlüsseldatei wird das Assembly signiert. Dies geschieht bei VisualBasic .NET entweder direkt beim Aufruf des Compilers über die Option /key-file. (Allerdings ist es in der Praxis üblich, den privaten Schlüssel erst ganzzum Schluss, wenn das Assembly ausgeliefert wird, einzubringen. Diese Pra-xis wird als »delayed signing«, also verzögerte Signierung bezeichnet.) Alter-nativ kann die Datei mit dem Schlüssel auch über ein Attribut (im allgemeinenFormat <Assembly: KeyFile("<Name.snk>")>) direkt im Quelltext angege-

Page 69: Jetzt lerne ich Visual Basic.NET  GERMAN

69

Vorteile für Programmierer

ben werden. (Wenn Sie mit Visual Studio .NET arbeiten, legt die IDE automa-tisch eine weitere Quelltextdatei mit dem Namen AssemblyInfo.vb an, in deralle diese Attribute enthalten sind.)

Schritt 3Das Assembly erhält eine Versionsnummer. Diese ist nicht obligatorisch, abersinnvoll bzw. notwendig, damit eine Unterscheidung anhand Versionsnum-mern möglich wird. (Wird keine Versionsnummer vergeben, erhält das As-sembly die Versionsnummer 0.0.0.0.) Die Versionsnummer kann entwederdirekt im Quelltext (meistens über die bereits erwähnte Quelltextdatei Assem-blyInfo.vb in der Form <Assembly: AssemblyVersion("1.0.0.0")>) oderbeim Aufruf des Assembly Linkers Al.exe, der aus einer Moduldatei ein As-sembly macht, angegeben werden.

Schritt 4Beim Kompilieren des Visual Basic .NET-Assembly muss über die Compiler-Option /r ein Verweis auf das Assembly im GAC angegeben werden. Und nunwird es ein wenig kompliziert, denn der Pfad ist extrem lang. Er besteht nichtnur aus dem GAC-Pfad (z.B. C:\WINXP\assembly\GAC\), sondern auchaus dem Pfad des öffentlichen Assembly, der aus einem Unterverzeichnis mitdem Namen des Assembly besteht. Und dieser setzt sich wiederum aus insge-samt vier Teilen zusammen:

� Der Versionsnummer

� Dem so genannten Kulturnamen (z.B. »de« für Deutschland; ist das As-sembly »kulturneutral«, was meistens der Fall ist, fällt diese Angabe weg).

� Dem so genannten Hash-Wert des öffentlichen Schlüssels. Dies ist eineaus »nur« 8 Byte bestehende Zahl, die den öffentlichen Schlüssel repräsen-tiert.

� Dem Namen des Assembly.

Der komplette Pfad des öffentlichen Assembly Fak.dll kann daher wie folgtlauten:

C:\WINXP\assembly\GAC\fak\1.0.0.0__7a837161014d098f\fak.dll.

Anders geht es leider nicht. Ein kleiner Trost: Wenn Sie mit Visual Studio.NET arbeiten, müssen Sie lediglich einen Verweis auf die DLL einfügen, in-dem Sie das Verzeichnis auswählen. Um den Rest kümmert sich die IDE.

2.6 Vorteile für Programmierer

Das .NET-Framework soll nicht nur Millionen Programmierer in aller Welt er-neut auf die Schulbank schicken und direkt oder indirekt bewirken, dass vieleProgrammierer ihre Programme, an denen sie jahrelang gearbeitet und in diesie viel Energie, Zeit und Geld gesteckt haben, bildlich gesehen »wegwerfen«und neu schreiben müssen. Das .NET-Framework soll vor allem die Program-

Page 70: Jetzt lerne ich Visual Basic.NET  GERMAN

70

Die .NET-Philosophie2mierung einfacher machen, Programmierer produktiver werden lassen undsie in die Lage versetzen, Aufgaben zu lösen und Herausforderungen zu be-gegnen, denen sie sich mit ihren alten Werkzeugen nicht stellen konnten1.Auch wenn es in diesem Kapitel nur um eine erste Übersicht geht, sollen auchdie Vorteile, die .NET für die (Windows-)Programmierung bietet, kurz aufge-listet werden (die Liste erhebt keinen Anspruch auf Vollständigkeit). In den fol-genden Bereichen bringt .NET Verbesserungen:

� Versionierung

� Sicherheit

� Vereinfachung durch Laufzeitdienste

� Vereinheitlichung

� Leistungsfähigere Programmiersprachen

� Durch und durch objektorientiert

� Zusammenarbeit zwischen Programmen

� Realisierung verteilter Anwendungen

� Mehr Spaß

2.6.1 Versionierung

Dies ist eines der wichtigsten Themen der Softwarewelt, das aber in erster Li-nie jene Programmierer angeht, die häufiger Releases ihrer Anwendungenausliefern müssen, in denen (COM-)Komponenten im Spiel sind. Der klassi-sche Fall sieht so aus: Programmierer A liefert seine Anwendung aus, in dereine COM-Komponente beteiligt ist. Programmierer B liefert ebenfalls eineAnwendung aus, die die gleiche COM-Komponente verwendet, allerdings ineiner unterschiedlichen Version. Installiert der Anwender die Anwendung vonProgrammierer B, nachdem bereits die Anwendung von Programmierer A in-stalliert wurde, überschreibt die Installationsprozedur unter Umständen dieCOM-Komponente (das muss nicht zwangsläufig so sein, kann aber auchnicht ausgeschlossen werden). Wie es weitergeht, hängt nun von den Götternder Softwarebranche und anderen Faktoren ab. Im ungünstigsten Fall hat dieneue Komponente (frei nach Murphy) bei einer Funktion den Datentyp einesParameters geändert, so dass, wenn Programm A die Funktion aufruft, derfalsche Parameter übergeben wird und das Programm (im harmlosesten Fall)mit einem Laufzeitfehler abbricht. Das ist noch ein sehr einfaches Szenario.Sind mehrere Komponenten beteiligt, kann schnell eine Situation entstehen,die kaum noch zu überblicken ist, zumal kein Programmierer verhindernkann, dass ein Anwender munter drauflos installiert und dabei, ohne es zu ah-

1. Und ganz nebenbei soll .NET Programmierer davon abhalten, auf Java zu wechseln.

Page 71: Jetzt lerne ich Visual Basic.NET  GERMAN

71

Vorteile für Programmierer

nen, wichtige Komponenten vielleicht durch ältere, vielleicht durch neuereVersionen ersetzt. Zwar sollte COM diesen Fall verhindern, indem es die »In-varianz« der Schnittstellen vorschrieb, doch was nützen die besten Vorsätze,wenn sich die Programmierer nicht daran halten?

Dieser Zustand des totalen Chaos bezüglich der Versionsnummern der an ei-nem Programm beteiligten Komponenten wird ironisch auch als »DLL-Hell«bezeichnet, da es in erster Linie die DLLs (darunter fallen alle COM-Kompo-nenten und ActiveX-Steuerelemente) sind, die in unterschiedlichen Versionenaber mit gleichen Dateinamen (und unter Umständen auch gleichen Regist-rierungsschlüsseln) vorliegen. Zwar hat Microsoft bereits mit Windows 2000und Windows XP einige Anstrengungen unternommen, DLL-Hell auch ohne.NET in den Griff zu kriegen, doch das grundsätzliche Problem lässt sich mitder COM-Architektur nicht lösen. Bei .NET wird es kein DLL-Hell mehr ge-ben. Ohne auf Details eingehen zu können, sei an dieser Stelle lediglich er-wähnt, dass alle öffentliche Assemblies (also jene, die in den Global AssemblyCache kopiert wurden) neben einem eindeutigen Schlüssel, der sie unver-wechselbar macht, auch eine Versionsnummer besitzen. Es ist daher wederein Problem, wenn mehrere gleichnamige Assemblies im GAC vorhandensind (sie müssen dann verschiedene Versionsnummern tragen), noch, wennein Assembly eine bestimmte Version eines anderen Assembly benötigt, die-ses aber nicht vorhanden ist. Für diesen Fall lässt sich in der Konfigurations-datei Vorsorge tragen, indem der Programmierer alternative Assemblies an-gibt.

2.6.2 Sicherheit

Auch die Codeausführungssicherheit war bei COM alles andere als optimalgelöst. Sobald ein ActiveX-Steuerelement über eine Webseite auf den Com-puter geladen wurde, gibt es keine Möglichkeit, die Ausführung zu unterbin-den, da es als DLL-Datei gleichberechtigt mit allen anderen DLLs unter denaktuellen Sicherheitseinstellungen des Anwenders ausgeführt wird. Ist dieserals Administrator angemeldet, stehen der Komponente Tür und Tor offen,mit allen damit verbundenen Konsequenzen. Die CLR bietet dagegen ein aus-gefeiltes Sicherheitskonzept, Code Access Security (CAS) genannt, das aufdem Sicherheitskonzept des Betriebssystems aufsetzt. Die Sicherheitseinstel-lungen erfolgen nicht deklarativ im Quelltext (auch wenn dies möglich ist),sondern über eine Konfigurationsdatei, in der sich im Detail festlegen lässt,wann der Aufruf einer Funktion erlaubt ist und wann nicht. Damit lässt sichdas Ausführungsverhalten des Programms definieren, ohne dass im Quell-code irgendwelche Änderungen notwendig sind. Ein und dasselbe VisualBasic .NET-Programm kann also einmal sehr restriktiv, ein anderes Mal ohneEinschränkungen ausgeführt werden. Verstößt das Programm gegen die vomAdministrator über Richtlinien (engl. »policies«) auferlegten Einschränkungen,wird eine Ausnahme ausgelöst, die vom Programmierer abgefangen wird.

Page 72: Jetzt lerne ich Visual Basic.NET  GERMAN

72

Die .NET-Philosophie2Der Anwender erfährt daher im Einzelfall, warum eine bestimmte Funktionnicht zur Verfügung steht, und wird nicht durch kryptische und allgemein ge-haltene Systemmeldungen verwirrt.

2.6.3 Vereinfachung durch Laufzeitdienste

Von dieser Verbesserung profitieren vor allem C++-Programmierer, denn Vi-sual Basic-Programmierer waren in diesem Punkt bereits in der Vergangen-heit sehr verwöhnt. Zu den Laufzeitdiensten, die die CLR anbietet, gehört inerster Linie das »life time management« der Objekte. Das bedeutet konkret,dass ein Programmierer sich nicht darum kümmern muss, nicht mehr benö-tigte Objekte zu entsorgen, da dafür die Garbage Collection der CLR zustän-dig ist. Das bedeutet auch, dass es keinen definierten Zeitpunkt dafür gibt,wann ein Objekt wieder aus dem Arbeitsspeicher entfernt wird (ein Umstand,der im Allgemeinen kein Thema ist).

2.6.4 Vereinheitlichung

Dieser Aspekt wurde bereits einmal angesprochen und wird in erster Linie derVollständigkeit halber wiederholt. Unter .NET und der CLR sind alle Anwen-dungen gleich. Es spielt keine Rolle, ob eine Anwendung mit Cobol, C++,C#, Java, Perl oder Visual Basic programmiert wurde, am Ende liegt IL-Codevor, dem man seine Herkunft nicht mehr ansieht. Das macht zum einen dieWahl der Programmiersprache sekundär, es führt zum anderen dazu, dassKomponenten, die in unterschiedlichen Programmiersprachen erstellt wur-den, sehr viel besser zusammenarbeiten können.

Eine weitere Vereinheitlichung ergibt sich aus dem Umstand, dass alle .NET-Programme selbstbeschreibend sind. Es gibt weder Typenbibliotheken nochirgendwelche Einträge in der Registrierung. Eine .NET-Komponente mussnicht registriert werden, damit andere Assemblies sie benutzen können. Dassind Vorteile, die sich zwar erst bei etwas größeren Projekten auswirken, dieaber einen der wesentlichen Vorzüge von .NET ausmachen.

2.6.5 Leistungsfähigere Programmiersprachen

Visual Basic .NET ist nicht nur einfach die .NET-Version von Visual Basic, esist auch eine komplett überarbeitete Version, bei der eine Reihe von Verbes-serungen eingeführt wurden. Diese reichen von Kleinigkeiten, wie der Mög-lichkeit, Variablen bei der Deklaration auch initialisieren zu können, bis hin zuanspruchsvolleren Eigenschaften, wie die Möglichkeit, neue Klassen auf derBasis vorhandener Klassen zu definieren (Vererbung) und während der Pro-grammausführung weitere Threads zu starten, um eine effektivere Auslastungdes Prozessors und eine Art »Parallelverarbeitung« zu erreichen (Multi-threading).

Page 73: Jetzt lerne ich Visual Basic.NET  GERMAN

73

Vorteile für Programmierer

2.6.6 Durch und durch objektorientiert

Visual Basic .NET ist, wie viele andere .NET-Programmiersprachen auch,durch und durch objektorientiert. Ein Visual Basic .NET-Programm basiertausschließlich auf Klassen (in Zusammenhang mit .NET auch Typen genannt).Jedes Datenelement ist ein Objekt, das über Methoden und Eigenschaftenverfügt und sich von der »Mutter aller Typen« System.Object ableitet. Das be-deutet zum Beispiel auch, dass ein Integer über eine ToString-Methode ver-fügt (auch wenn dies nicht unbedingt erforderlich wäre), da diese von Sys-tem.Object »geerbt« wird. Diese vollständige Objektorientiertheit steht ineinem starken Gegensatz zu früheren Versionen, wo die Objektorientierungnachträglich (mit Version 4.0) eingebaut wurde und in erster Linie zur Imple-mentierung von COM-Komponenten gedacht war und daher zahlreiche Ein-schränkungen und Besonderheiten aufwies. Das ist am Anfang etwas unge-wohnt, führt aber letztendlich dazu, dass die Programmierung einheitlicherund einfacher wird.

2.6.7 Zusammenarbeit zwischen Programmen

Bereits das Component Object Model (COM) hatte den Anspruch, die Zu-sammenarbeit zwischen unterschiedlichen und vor allem unabhängigen Pro-grammen zu verbessern. Für Visual Basic-Programmierer ist es selbstver-ständlich geworden, dass sie etwa auf Excel (als COM-Server) zugreifen oderdie Scripting Runtime (etwa für das FileSystemObject) in ihren Programmenbenutzen können, ohne sich über das genaue Wie und Warum Gedanken ma-chen zu müssen. Doch das COM-Prinzip hat seine Grenzen. Was ist mit denunzähligen COM-Komponenten, die sich auf der Festplatte des Computersbefinden (und in der Registrierung registriert wurden) und die sich nicht nut-zen lassen, da es a) keine kompatiblen Schnittstellen und b) keine Dokumen-tation ihrer Schnittstellen gibt? Was ist mit COM-Komponenten, die sich zwarnutzen lassen, aber zu einem Laufzeitfehler führen, da sie in einer geringfügigmodifizierten Form vorliegen? Alle diese Dinge haben in der Vergangenheitdazu geführt, dass die Idee der universellen Zusammenarbeit zwar irgendwiemachbar war, in der Praxis aber oft an Details (und der Bequemlichkeit derProgrammierer) scheiterte. Bei .NET ist universelle Zusammenarbeit keinSchlagwort oder ein Anspruch, der erst durch die Programmierer durch dasEinhalten von komplizierten Spezifikationen und das Schreiben von Schnitt-stellendokumentationen erfüllt wird. Es ist von Anfang an Realität. Hier einetwas exotisches, aber durchaus realistisches Beispiel: Schreibt ein Cobol-Programmierer eine .NET-Komponente, kann diese sofort und ohne Konver-tierung oder Registrierung von einem Visual Basic .NET-Programmierer be-nutzt werden (vorausgesetzt, die Cobol .NET-Komponente hält sich an dieCTS-Datentypen und an die allgemeinen Namenskonventionen – ganz ohneÜbereinkünfte geht es also auch bei .NET nicht). Ja mehr noch, das Visual

Page 74: Jetzt lerne ich Visual Basic.NET  GERMAN

74

Die .NET-Philosophie2Basic .NET-Programm kann Klassen der Cobol-Komponente erweitern undSchnittstellen der Komponente implementieren (sofern sich in Cobol .NETüberhaupt Schnittstellen definieren lassen). Möglich wird diese universelle Zu-sammenarbeit durch den Umstand, dass jede .NET-Komponente ihre Be-schreibung gleich mitliefert und jede andere .NET-Komponente diese Be-schreibung auswerten kann.

Die folgende kleine Übung soll dies unter Beweis stellen. Sie werden eine klei-ne Komponente in C# programmieren (versprochen, es ist der einzige C#-Code, der in diesem Buch gezeigt wird) und Sie werden eine Funktion in derKomponente von einem Visual Basic .NET-Programm aufrufen, indem Sieeine Klasse definieren, die die Klasse der C#-Komponente erweitert. Alles daswird sich mit wenigen Befehlszeilen und ohne Tricks und andere Klimmzügeerledigen lassen.

Schritt 1 Starten Sie Notepad (oder Ihren Lieblingseditor) und geben Sie die Befehleaus Listing 2-3 ein. Es handelt sich um ein kleines C#-Programm (achten Siedaher auf Groß-/Kleinschreibung, der Compiler versteht hier keinen Spaß),das eine Komponente darstellt, die aus einer Klasse mit einer Methode be-steht. Der Methode fak in der Klasse Fak wird eine Ganzzahl übergeben, siegibt daraufhin die Fakultät dieser Zahl zurück.

Listing 2-3:Diese C#-

Komponenteberechnet dieFakultät einer

Zahl

// ----------------------------------------------// Eine C#-Komponente// Jetzt lerne ich Visual Basic .NET (nicht C#)// ----------------------------------------------

using System;

public class Fak{

public int fak (int zahl) { for (int i=zahl-1;i!=1;i--) { zahl*=i;// System.Console.WriteLine(zahl); } return zahl; }}

Schritt 2 Speichern Sie das C#-Programm in einer Datei mit dem Namen »Fak.cs«.

Buch-CD: fak.cs

Page 75: Jetzt lerne ich Visual Basic.NET  GERMAN

75

Vorteile für Programmierer

Schritt 3Erstellen Sie mit Notepad nun eine weitere Datei. Dieses Mal ist es ein VisualBasic .NET-Programm (aufatmen, der Spuk ist vorbei). Geben Sie die Befehleaus Listing 2-4 ein und speichern Sie die Datei unter dem Namen »Fak-test.vb«.

Listing 2-4:Dieses Visual Basic .NET-Programm be-nutzt die C#-Komponente

' -----------------------------------------------' Zugriff auf C#-Komponente' Jetzt lerne ich Visual Basic .NET (und nicht C#)' -----------------------------------------------Imports System.Console

Class App Shared Sub Main ()Eingabe: Dim obFak = New Fak() Write("Zahl? ") Try Dim Zahl As Integer = ReadLine() Writeline("Die Fakultät von {0} ist: {1}", _ Zahl, obFak.Fak(Zahl)) Catch WriteLine ("Bitte Zahl eingeben!") Goto Eingabe End Try ReadLine() End SubEnd Class

Schritt 4Kompilieren Sie das C#-Programm durch folgenden Aufruf in der Eingabe-aufforderung:

csc /t:library fak.cs

Csc.exe ist der C#-Kommandozeilencompiler, der aus der Quelltextdatei eineausführbare Programmdatei macht. Das Ergebnis ist eine DLL mit dem Na-men Fak.dll. Dies ist die C#-Komponente, die nun allerdings im (neutralen)IL-Code vorliegt.

Schritt 5Kompilieren Sie nun auch das Visual Basic .NET-Programm:

vbc faktest.vb /r:fak.dll

Über die Option /r wird die angegebene DLL eingebunden.

Schritt 6Starten Sie das resultierende Programm Faktest.exe. Es sollte eine kleineEingabeaufforderung erscheinen. Nach der Eingabe einer Zahl wird die Fakul-tät dieser Zahl ausgegeben.

Buch-CD: faktest.vb

Page 76: Jetzt lerne ich Visual Basic.NET  GERMAN

76

Die .NET-Philosophie2Das war ein kleines Beispiel dafür, wie problemlos unter .NET Programme zu-sammenarbeiten, die in unterschiedlichen Sprachen programmiert wurden.Bemerkenswert ist auch, dass das Visual Basic .NET-Programm keinen direk-ten Verweis auf die C#-Komponente enthält. Der Compiler erkennt automa-tisch, dass es sich bei Fak um einen Typ handelt, der nicht in dem Programmdefiniert ist, und durchsucht nun die über die Option /r angegebenen externenBibliotheken.

2.6.8 Realisierung verteilter Anwendungen

Dieser Aspekt ist letztendlich der, um den sich alles bei .NET dreht. Man kannüber .NET-Basisklassen, gemeinsame Datentypen, Metadaten, die sich zurLaufzeit auswerten und erweitern lassen, und vieles mehr ausführlich debat-tieren. Alles das wurde von Microsoft nur geschaffen, um die Programmie-rung verteilter Anwendungen (wobei das Internet das Medium ist, über dasdiese Anwendungen zusammenarbeiten) zu vereinfachen bzw. überhaupt erstzu ermöglichen. Mit COM+ hat Microsoft bereits vor Jahren eine Infrastruk-tur geschaffen, die verteilte Anwendungen erstmals möglich machte, und un-ter dem Namen Distributed Network Architecture (DNA) auch alles in schö-ne Worte gepackt und in Hochglanzprospekten zusammengefasst. DochCOM+ ist nur ein Teilaspekt, der für viele Visual Basic-Programmierer zudemwie ein Buch mit (mindestens) sieben Siegeln erschien. Die anderen Kom-ponenten, vor allem HTTP als Transportprotokoll und XML als universellesDaten- und Befehlsformat, waren zwar auch vorhanden, doch war es für vieleProgrammierer schwierig, sie zusammenzubringen. Das wird mit .NET an-ders. .NET ist von Anfang an eine Programmierumgebung, in der sich verteil-te Anwendungen auf der Basis von COM+ (das in der Version 1.0 von .NETnoch gekapselt wird, in späteren Versionen jedoch ersetzt werden soll), HTTPund XML umsetzen lassen. Und zwar nicht nur in C#, sondern auf exakt diegleiche Weise auch in Visual Basic .NET.

2.6.9 Mehr Spaß

Auch dieser Aspekt soll kurz angesprochen werden, denn auch die Program-mierung unter .NET soll Spaß machen, selbst wenn es am Anfang nicht im-mer den Anschein haben mag und man sich vielleicht überlegt, dass Microsoftalles nur geändert hat, um Visual Basic-Programmierern den Spaß zu verder-ben. Das ist natürlich nicht so. Der Spaß bei .NET ergibt sich aus der Leich-tigkeit, mit der sich unterschiedliche Assemblies verbinden lassen, der umfas-senden Klassenbibliothek, die den Aufruf von API-Funktionen praktischüberflüssig macht, der vollständigen Dokumentation des .NET-Frameworkund nicht zuletzt aus der neuen Entwicklungsumgebung, die bezüglich Kom-fort und Möglichkeiten einen echten Meilenstein darstellt (wenngleich viele Vi-sual Basic-Programmierer sich zunächst an den Umstand gewöhnen müssen,

Page 77: Jetzt lerne ich Visual Basic.NET  GERMAN

77

Weitere Bestandteile von .NET

dass es nicht mehr möglich ist, Programmänderungen während einer Unter-brechung durchzuführen, und dass das Direktfenster leider kein Intellisensebietet).

2.7 Weitere Bestandteile von .NET

Im letzten Abschnitt wurden die Kernbestandteile von .NET bzw. des .NET-Framework vorgestellt. Doch das ist noch längst nicht alles. .NET hat noch ei-niges mehr zu bieten:

� C# und Visual Basic .NET

� ASP .NET

� Webservices

� ADO .NET

� Windows Forms

Die Aufzählung wird lediglich der Vollständigkeit halber kurz abgehandelt, dajeder Themenbereich im Grunde ein eigenes Buch erfordern würde und indiesem Buch Visual Basic .NET im Vordergrund steht. Da jedoch in diesemKapitel alle wichtigen Elemente von .NET kurz erwähnt werden sollen, müs-sen auch diese Schlagwörter mit ein paar erklärenden Worten bedacht wer-den.

2.7.1 C# und Visual Basic .NET

Visual Basic .NET ist der Nachfolger von Visual Basic 6.0, C# (ausgespro-chen wie C-Sharp) ist der Name einer neuen Programmiersprache, die unterder Leitung von Anders Hejlsberg entwickelt wurde1 und die sich in erster Li-nie an C++-, Java- und in gewissem Sinne auch an Delphi-Programmiererrichtet, weniger aber an Visual Basic-Programmierer. In diesem Buch soll ab-sichtlich auf eine Gegenüberstellung verzichtet werden. Nur so viel zu diesemThema: Es gibt vermutlich keinen vernünftigen Grund, C# gegenüber VisualBasic .NET vorzuziehen, und es ist auch nicht richtig, dass bei .NET die Wahlder Programmiersprache keine Rolle mehr spielt. C# und Visual Basic .NETsind praktisch ebenbürtig, auch wenn C# in einigen Fällen eine etwas »klare-re« Syntax besitzt und die offizielle »Systemsprache« von .NET ist (die .NET-Basisklassen wurden zum großen Teil in C# programmiert).

1. Für alle Leserinnen und Leser, die nicht so mit der Historie der Entwicklungstools vertrautsind: Anders Hejlsberg ist der »Erfinder« von Borland Turbo Pascal, eine der populärsten Pro-grammiersprachen der 80er Jahre, der Chefentwickler von Borland Delphi und seit einigenJahren bei Microsoft tätig.

Page 78: Jetzt lerne ich Visual Basic.NET  GERMAN

78

Die .NET-Philosophie22.7.2 ASP .NET

ASP .NET ist der Nachfolger von ASP (Active Server Pages) und die Tech-nologie für die Programmierung von Webanwendungen auf der Basis derCLR und des .NET-Framework. Im Unterschied zu den schlichten ASP-Sei-ten, die sich nur mit Scripts erweitern ließen und bei denen die saubere Tren-nung zwischen Benutzeroberfläche und Programmcode sehr schwierig war,kann die Programmierung von Webanwendungen auf der Basis von ASP.NET in Visual Basic .NET, C# und im Prinzip in jeder anderen .NET-Pro-grammiersprache erfolgen. Für Visual Basic-Programmierer ist das eine sehrgute Nachricht, denn die Entwicklung von Webanwendungen wird, insbeson-dere wenn Visual Studio .NET benutzt wird, so einfach wie die Entwicklungvon Windows-Anwendungen in der Vergangenheit. Das bedeutet aber nicht,dass jeder seine Homepage mit Visual Basic programmieren kann. Vorausset-zung, um eine Visual Basic .NET-Anwendung über das Internet ansprechenzu können, ist ein Provider, der Windows 2000 als Betriebssystem benutztund eine ASP .NET-Anwendung hosten kann.

IIS- und DHTML-Projekte, die mit Visual Basic 6.0 erstellt wurden, werdenvon Visual Basic .NET nicht unterstützt und können auch in Visual Studio.NET nicht geladen werden. Es sollte aber nicht allzu schwierig sein, ein sol-ches Projekt als ASP .NET-Anwendung neu zu programmieren.

2.7.3 Webdienste

Webdienste (auch Webservices oder XML Webservices genannt) sind natürlichdas Schlagwort, das von Microsoft (und damit auch in der Öffentlichkeit) amhäufigsten mit .NET in Verbindung gebracht wird. Dabei ist ein Webdienst beiVisual Basic .NET lediglich ein Projekttyp unter mehreren, der sich in weni-gen Zeilen erstellen lässt und keine »magischen Kräfte« besitzt und auch nichtmit der Erfindung des Rads vergleichbar ist. Ein Webservice ist lediglich eine(beliebige) Funktion in einer Komponente (DLL, Assembly usw. – Webdienstelassen sich im Prinzip in jeder x-beliebigen Programmiersprache erstellen undsetzen auch nicht .NET-Technologien voraus), die auf einem Webserver be-heimatet ist und daher über eine URL und das HTTP-Protokoll aufgerufenwird. Für den Datenaustausch wird XML verwendet. Als eine Art Standard-protokoll hat sich das SOAP-Protokoll (Simple Object Access Protocol) her-auskristallisiert, das von Microsoft in Zusammenarbeit mit anderen Software-firmen (hier werden stets Ariba und IBM genannt) entwickelt wurde und dassich auch von Visual Basic 6.0 aus benutzen lässt, allerdings nicht so komfor-tabel wie innerhalb von Visual Studio .NET.

Webdienste sind vor allem für größere Unternehmen im Rahmen von Down-sizing-Szenarien interessant und eine Möglichkeit, effektiv eine verteilteArchitektur aufzubauen. Für den »normalen« Visual Basic-Programmierer

Page 79: Jetzt lerne ich Visual Basic.NET  GERMAN

79

Die Common Language Infrastructure (CLI) für Linux & Co.

spielen sie vermutlich keine allzu große Rolle, auch wenn sie einfach zu pro-grammieren sind.

2.7.4 ADO .NET

ADO .NET ist jener Teil der .NET-Basisklassen, der für den Zugriff auf »per-sistente Speichermedien«, etwa Datenbanken, zuständig ist. ADO .NET istvor allem für ASP .NET-Anwendungen interessant, da sich das DataSet-Ob-jekt, als wichtigster Baustein von ADO .NET, sehr flexibel verbindungslos ein-setzen lässt, seinen Inhalt komplett im XML-Format speichert und damit idealfür den Austausch von Datensätzen über das Internet (bzw. allgemein über dasHTTP-Protokoll) mit eingebauter Aktualisierung geeignet ist. Außerdem stelltdie Visual Studio .NET-Entwicklungsumgebung eine Reihe komfortabler As-sistenten bereit, die die Anbindung an eine Datenbank sehr einfach machen.Für Visual Basic-Programmierer, die lediglich in gewohnter Weise auf Access-, SQL-Server oder Oracle-Datenbanken zugreifen möchten, ist ADO .NET imAllgemeinen kein Thema, da sich ADO 2.x über die COM-Interoperabilitätwunderbar auch unter Visual Basic .NET ansprechen lässt (lediglich die Ge-schwindigkeit sollte am Anfang einmal getestet werden, da sich der Overheadder COM-Interoperabilität nicht verallgemeinern lässt).

2.7.5 Windows Forms

Diese Frage dürften sich viele Visual Basic-Programmierer als Erstes stellen:Wo sind denn die Formulare geblieben? Sie sind natürlich auch bei .NET vor-handen. Die neuen Formulare heißen Windows Forms, sind sehr viel leis-tungsfähiger als ihre Vorgänger und stehen als ein allgemeiner Bestandteil der.NET-Basisklassen allen Programmiersprachen (also auch C#) auf die gleicheWeise zur Verfügung. Auch wenn sich Windows Forms komplett mit einemEditor programmieren ließen (es handelt sich ausschließlich um .NET-Klas-sen), wird dies in der Praxis niemand wollen, da dies viel zu umständlich wäre.Windows Forms-Anwendungen werden in der Regel mit Visual Studio .NETprogrammiert und in diesem Buch in Kapitel 14 vorgestellt.

2.8 Die Common Language Infra-structure (CLI) für Linux & Co.

Dieser interessante Aspekt hat (leider) nur indirekt etwas mit Visual Basic.NET zu tun. Da das .NET-Framework von seiner Konzeption her sowohl un-abhängig von einem bestimmten Prozessor als auch vom Betriebssystem ist,lässt es sich auch auf andere Betriebssysteme und Prozessoren portieren. Undgenau das beabsichtigt Microsoft im Rahmen der Common Language Infra-

Page 80: Jetzt lerne ich Visual Basic.NET  GERMAN

80

Die .NET-Philosophie2structure (CLI). Ähnlich wie Java soll auch die CLI vom Großrechner bis zumMobiltelefon »überall« vorhanden sein. Die CLI umfasst folgende Elemente:

� Die CLR

� Wichtige Teile der .NET-Basisklassen

� Den C#-Compiler

� Die wichtigsten Tools des .NET-Framework-SDK

Hinter der CLI stehen aber nicht nur jene Elemente des .NET-Framework, dieauf andere Plattformen portiert werden sollen. Unter dem Namen SharedSource gibt Microsoft gleichzeitig den Quellcode der CLI frei, so dass ihn an-dere Programmierer anschauen und auch für eigene (private) Projekte benut-zen können. Allerdings ist das Shared Source-Lizenzmodell restriktiver als dasOpen Source-Modell und sieht zum Beispiel keine kommerzielle Nutzung derCLI oder modifizierter Teile vor1. Die Shared Source-Implementierung derCLI ist vor allem für Universitäten oder auch Hobbyprogrammierer interes-sant, die den Quellcode der CLI studieren oder ihn auf andere Plattformenportieren möchten.

Die CLI wird von der kanadischen Softwarefirma Corel2 auf das Betriebssys-tem Unix FreeBSD portiert. Unter der Leitung des bekannten Programmie-rers Miguel de Icaza, der in der Linux-Welt durch sein Gnome-ProjektBerühmtheit erlangte, findet im Rahmen des Projekts Mono auch eine Por-tierung auf das bekannte Betriebssystem Linux statt, die aber offiziell nichtvon Microsoft unterstützt wird. Wohl gemerkt, es geht dabei stets um die CLIim Rahmen der Shared Source-Lizenz und nicht um das komplette .NET-Framework. Visual Basic .NET wird genauso wenig portiert, wie die WindowsForms-Formulare und wichtige Teile der Basisklassen. Es ist aber dennocherstaunlich und faszinierend, mit welchem Enthusiasmus und Können vieleProgrammierer in der ganzen Welt die Herausforderung annehmen und z.B.einen Teil der Basisklassen auf eigene Initiative nach Linux portieren, so dassdie Programmierung (für C#-Programmierer) immer vollständiger wird.

2.9 Zusammenfassung

Wie würden Sie, nachdem Sie dieses Kapitel (hoffentlich) aufmerksam durch-gelesen haben, auf die Frage »Was ist denn nun .NET?« antworten? Vielleichtmit ».NET ist ein Traum, der für Programmierer endlich Wirklichkeit gewor-den ist«? Auch wenn Sie das Ganze (zu Recht natürlich) noch nicht ganz so

1. Wir reden hier immerhin über Microsoft.

2. In die Microsoft vor einigen Jahren 150 Millionen US$ investiert hat und dadurch einegewisse Einflussmöglichkeit besitzt.

Page 81: Jetzt lerne ich Visual Basic.NET  GERMAN

81

F&A

euphorisch sehen, bringt .NET so viele kleine und größere Verbesserungen,dass es nach einer Weile schwer fällt, nicht spontan einen Freudentanz aufzu-führen. Und das Beste ist: In diesem Kapitel war von den Webservices, die oftals Erstes aufgezählt werden, wenn es um die Bedeutung von .NET geht, garnicht bzw. nur am Rande die Rede. Das sollte hoffentlich das Vorurteil wider-legen, dass .NET nur für »neumodische« Dinge, wie Internetprogrammierung,interessant ist (wenngleich diese Themen wirklich wichtig sind und in Zukunft,das ist kein Geheimnis, an Bedeutung stark gewinnen werden). .NET ist ein-fach die dritte Generation der Microsoft-Programmierplattform. (Kurz zur Er-innerung: Die ersten beiden Generationen waren DOS und Win32.)

2.10 F&A

Frage 2-1

Welche Mindestvoraussetzung muss auf einem Computer mit Windows 2000erfüllt sein, damit ein Visual Basic .NET-Programm dort läuft?

Frage 2-2

Wie heißt der Programmcode, der von einem Visual Basic .NET-Compiler er-zeugt wird?

a) P-Code

b) 80x86-Maschinencode

c) IL-Code

d) Das hängt davon ab, ob eine Exe- oder eine DLL-Datei kompiliert wird.

e) Java-Byte-Code

Es ist nur eine Antwort richtig.

Frage 2-3

Wie kann ein Visual Basic .NET-Programm sicherstellen, dass die .NET-Ba-sisklassen, auf die es zugreift, auf jedem Computer vorhanden sind, auf demes ausgeführt werden soll?

a) Die .NET-Basisklassen müssen mit ausgeliefert werden.

b) Die .NET-Basisklassen sind ein fester Bestandteil der .NET-Laufzeitumge-bung.

Es ist nur eine Antwort richtig.

Page 82: Jetzt lerne ich Visual Basic.NET  GERMAN

82

Die .NET-Philosophie2Frage 2-4

Beschreiben Sie ein Assembly in einem Satz.

Frage 2-5

Was ist der Unterschied zwischen einem privaten und einem öffentlichen As-sembly?

Frage 2-6

Welche Voraussetzung muss ein Assembly erfüllen, damit es in den GlobalAssembly Cache (GAC) kopiert werden kann?

Frage 2-7

Welche drei verschiedenen Dateitypen kann der Visual Basic .NET-Compilererzeugen? (Die Antwort ist nicht direkt im Kapitel zu finden.)

Frage 2-8

Welche Voraussetzungen müssen erfüllt sein, damit ein Visual Basic .NET-Programm eine in C# programmierte Klasse erweitern kann?

a) Keine, der Programmierer kann die Klasse einfach ansprechen, als wäresie Teil des Visual Basic .NET-Programms. Und beim Kompilieren wird le-diglich der Name der DLL angeben, in der sich die C#-Klasse befindet.

b) Das ist natürlich alles andere als trivial, da es sich um zwei grundsätzlichverschiedene Programmiersprachen handelt (C# kann nämlich auch un-sicheren Code ausführen und ist daher höchst problematisch). DiesesThema wird in diesem Buch daher nicht behandelt.

c) Kein Problem, allerdings muss dazu eine Erweiterung mit dem Namen».NET Enhancer« von der Website www.dotnetstuff.net heruntergeladenwerden, die immer noch im Beta-Stadium ist.

Es ist nur eine Antwort richtig.

(Alle Antworten und Lösungen finden Sie in Anhang D.)

Page 83: Jetzt lerne ich Visual Basic.NET  GERMAN

83

KAPITEL 3

Visual Basic .NET-Einmaleins

In diesem Kapitel geht es um das »Standardzubehör« einer jeden Program-miersprache. Dazu gehören Variablen, Konstanten, Operatoren, die Regeln,nach denen Ausdrücke ausgewertet werden, und natürlich auch die Frage,wie einfache Eingaben und Ausgaben durchgeführt werden (einige Leser wer-den überrascht sein, dass Fenster keine Rolle spielen – dieses »Geheimnis«wird am Ende des Kapitels gelöst). Da dies alles beim besten Willen nichtmehr in die Überschrift zu diesem Kapitel gepasst hätte, geht es in diesemKapitel einfach um das Einmaleins von Visual Basic .NET. Da noch nichts vonden folgenden Kapiteln vorweggenommen werden soll, bleibt alles relativsimpel.

Die Themen für dieses Kapitel:

� Kleine Merkzettel für das Programm: die Variablen

� Charakterfest und beständig: die Konstanten

� Spezialisten fürs Rechnen: die Operatoren

� Alles genau nach Vorschrift: die Operatorreihenfolge

� Wahr oder falsch? – die Welt der logischen Verknüpfungen

� Eingaben über die Tastatur

� Ausgaben auf dem Bildschirm

� Der allgemeine Aufbau eines Visual Basic .NET-Programms

Page 84: Jetzt lerne ich Visual Basic.NET  GERMAN

84

Visual Basic .NET-Einmaleins3

3.1 Kleine Merkzettel für das Programm: die Variablen

Variablen dienen zum Speichern von Werten, die während der Programmaus-führung anfallen. Variablen speichern diese Werte in Speicherzellen im Ar-beitsspeicher des Computers. Wo sich diese Speicherzellen befinden, mussden Programmierer nicht interessieren, denn Variablen werden über Namenangesprochen. Damit ein Programm weiß, dass ein Name für eine Variablesteht, muss der Name im Programm »bekannt gemacht« werden. Dies wirdDeklaration der Variablen genannt. Visual Basic .NET kennt nicht nur einen,sondern gleich mehrere Befehle zur Variablendeklaration. Der bekanntesteBefehl ist der Dim-Befehl.

3Dim Anzahl As Integer

Dieser Befehl definiert eine Variable mit dem Namen Anzahl mit dem Daten-typ Integer. Mehr zu den Datentypen bietet Kapitel 3.2.2.

3.1.1 Variablen mit einem Anfangswert belegen

Eine Variable, die ohne einen Anfangswert definiert wird, besitzt (je nach Da-tentyp) den Wert 0 oder den Spezialwert Null. In der Regel möchte der Pro-grammierer der Variablen jedoch einen Startwert geben.

3Dim Anzahl As Integer = 123

3.1.2 Mehrere Variablen in einem Befehl deklarieren

Es lassen sich auch mehrere Variablen in einem Befehl deklarieren. Wird derDatentyp nur bei der letzten Variablen angegeben, erhalten alle Variablen die-sen Datentyp. Dies ist die übliche Praxis.

3Dim Treffer, Versuche, MaxVersuche As Integer

3.1.3 Mehrere Variablen mit unterschiedlichen Datentypen in einem Befehl deklarieren

Mehrere Variablen, die in einem Befehl deklariert werden, müssen nicht diegleichen Datentypen besitzen. Sollen eine oder mehrere Variablen mit einemWert initialisiert werden, ist dies sogar Voraussetzung.

3Dim Treffer As Long, Versuche As Byte=7, MaxVersuche As Integer = 123

Page 85: Jetzt lerne ich Visual Basic.NET  GERMAN

85

Die Merkmale einer Variablen

3.1.4 Weitere Deklarationsbefehle

Neben dem Dim-Befehl kennt Visual Basic .NET noch eine Reihe weitererBefehle zur Deklaration von Variablen. Dazu gehören die Befehle Friend, Pri-vate, Protected und Public. Diese Befehle unterscheiden sich dadurch vonDim, dass sie gleichzeitig einen so genannten Gültigkeitsbereich festlegen(also einen Bereich, in dem die Variable angesprochen werden kann) und, wiebei Protected, nur in Klassen benutzt werden können. Mehr zum Thema Gül-tigkeitsbereich von Variablen in Kapitel 3.2.3.

3.2 Die Merkmale einer Variablen

Jede Variable besitzt in einem Visual Basic .NET-Programm vier Merkmale:

� Name

� Datentyp

� Gültigkeitsbereich

und

� Lebensdauer

Alle vier erhält sie bereits bei ihrer Deklaration – sie lassen sich nachträglichnicht mehr ändern. Lediglich der Wert kann später (beliebig oft) zugewiesenwerden.

3Der folgende Befehl definiert eine Variable mit dem Namen iWert und demDatentyp Short.

Dim iWert As Short

Definieren oder deklarieren?

Heißt es bei Variablen nun definieren oder deklarieren? Im Allgemeinenspricht man von einer Deklaration einer Variablen (von definieren zu spre-chen, ist aber auch nicht falsch).

3.2.1 Formal und trotzdem unverzichtbar: der Datentyp

Jede Variable besitzt einen Datentyp. Der Datentyp legt fest, welche »Sorte«von Daten in der Variablen gespeichert werden können. Diese Unterschei-dung ist wichtig, damit der Compiler die benötigte Anzahl an Speicherzellenim Arbeitsspeicher (der bei .NET von der CLR verwaltet wird) reservierenkann. Dazu muss man wissen, dass eine Speicherzelle stets die gleiche Größebesitzt (8 Bit), Variablen aber sehr viel größer sein können. So belegt ein

Page 86: Jetzt lerne ich Visual Basic.NET  GERMAN

86

Visual Basic .NET-Einmaleins3Short-Datentyp zwei, ein Integer vier und eine Double-Variable acht Spei-cherzellen. Indem bei der Deklaration einer Variablen ein Datentyp angege-ben wird, kann der Compiler eine entsprechende Information in die Pro-grammdatei eintragen, so dass die CLR später den benötigten Speicherplatzreservieren kann.

Es gibt noch einen weiteren Grund, warum der Datentyp bei einer Variablenwichtig ist. Durch die Angabe eines Datentyps erhält der Compiler die Gele-genheit, bereits bei der Kompilierung zu überprüfen, ob eine Zuordnung er-laubt ist. Hier ein kleines Beispiel: Eine Variable Alter soll das Alter einer Per-son enthalten. Ein Visual Basic .NET-Programmierer könnte die Variable wiefolgt deklarieren:

Dim Alter

Der Datentyp sollte Byte sein, wurde hier entweder vergessen oder absichtlichnicht angegeben. Wird der Variable nun ein negativer Wert zugewiesen (in derRegel geschieht dies versehentlich oder aufgrund einer falschen Eingabedurch den Benutzer), so hat dies keine Folgen:

Alter = - 99

Das kann natürlich nicht gut gehen, da ein Byte-Wert keine negative Zahlendarstellen kann. Auch wenn das Programm dadurch nicht abstürzen kann,rechnet es von jetzt an mit dem falschen Wert, so dass alle folgenden Berech-nungen ebenfalls mit falschen Werten durchgeführt werden. Irgendwann läuftdas Programm gegen eine »Mauer« (etwa, wenn der Wert in eine Datenbankgespeichert werden soll) und eine Ausnahme ist die Folge. Wird die Variabledagegen bei ihrer Deklaration mit einem Datentyp versehen, sieht es ein we-nig anders aus:

Dim Alter As Byte

Wird nun ein negativer Wert zugewiesen, gibt Visual Basic .NET bereits beimKompilieren eine Fehlermeldung aus. Mit anderen Worten, mit diesem Befehlkann das Programm gar nicht erst kompiliert werden, ein unter Umständenschwer zu findender Fehler wird dadurch vermieden. Es ist interessant, dassder Compiler nicht so einfach zu überlisten ist. Die folgenden beiden Zuwei-sungen führen ebenfalls zu einer Fehlermeldung:

Alter = 99 - 100Alter = (10 * 5) – 51

Der folgende Befehl ist dagegen in Ordnung:

Alter = (10 * 5) – 50

Würde der zugewiesene Ausdruck dagegen eine Variable enthalten, wäre derCompiler nicht in der Lage, den Wert auszurechnen. Die folgende Befehlsfol-

Page 87: Jetzt lerne ich Visual Basic.NET  GERMAN

87

Die Merkmale einer Variablen

ge führt zwar zu einer Ausnahme (vom Typ System.OverflowException),wird vom Compiler aber nicht erkannt:

Dim a, b As Byteb = 100a = 50 – b

1Tabelle 3.1 zeigt alle Datentypen in der Übersicht (eine ausführlichere Auf-listung finden Sie selbstverständlich in der Hilfe). In der rechten Spalte ist derName des .NET-Datentyps angegeben. Dies sind die Namen der CLR, dieebenfalls für die Deklaration verwendet werden können – so ist die Verwen-dung von System.Int32 unter Umständen ein wenig eindeutiger als die vonInteger.

Tabelle 3.1:Die Daten-typen von Visual Basic .NET in der Übersicht

Wird bei der Deklaration einer Variablen kein Datentyp angegeben, erhältdiese den Datentyp Object.

Daten-typ

Anzahl Bytes

Wertebereich Anmerkung .NET-Datentyp

Boolean 2 –1 (True) oder 0 (False) – System.Boolean

Byte 1 0 bis 255 – System.Byte

Char 2 1 Unicode-Zeichen (16 Bit) Ist nicht mit dem Datentyp String kompatibel.

System.Char

Date 8 1.1.1 bis 31.12.9999 – System.Date

Decimal 16 Bis zu 28 Nachkommastellen (der genaue Bereich muss der Hilfe entnommen werden).

Bei Visual Basic 6.0 konnte die-ser Datentyp nicht deklariert werden.

System.Decimal

Double 8 Bis zu 16 Nachkommastellen (der genaue Bereich muss der Hilfe entnommen werden).

Die Genauigkeit beträgt maximal 15 Stellen nach dem Komma.

System.Double

Integer 4 –2.147.483.648 bis 2147.483.647.

Bei Visual Basic 6.0 war dies der Datentyp Long.

System.Int32

Long 8 –9.223.372.036-854.775.808 bis 9.223.372.036.854.775.807.

– System.Int64

Page 88: Jetzt lerne ich Visual Basic.NET  GERMAN

88

Visual Basic .NET-Einmaleins3

3.2.2 Typisch Basic – der Datentyp ist freiwillig

Ein wenig ähnelt Visual Basic .NET einer netten Party in einem Freizeitclub:Alle sind gut gelaunt und reden sich mit den Vornamen (den Variablennamen)an. Nach dem Motto »Sag einfach X zu mir und lass das förmliche »Integer«weg«, dürfen bei Visual Basic .NET Variablen auch ohne Datentyp deklariertwerden. Visual Basic .NET setzt als Nachnamen einfach den Namen ein, denalle erhalten, die sich nicht festlegen wollen: Object.

Alle anderen Programmiersprachen (etwa C#) sind sehr viel formeller: JederGast (also jede Variable) muss sich mit Namen und Nachnamen (den Daten-typ) vorstellen, sonst wird sie nicht akzeptiert (und da heißt es immer, VisualBasic wäre keine coole Sprache). Auch wenn das etwas Legere am Anfangrecht interessant wirken mag und es immerhin auch nach einer Arbeitserspar-nis aussieht, verwenden Sie trotzdem stets Datentypen, wenn Sie eine Vari-able deklarieren. Aus zwei Gründen: 1. Das Programm wird dadurch etwasschneller, denn der Standarddatentyp Object ist zwangsläufig etwas behäbig,da er mit »allem rechnen« muss. Das macht sich aber erst bei großen Program-men oder in Schleifen bemerkbar. 2. Je mehr Informationen Sie dem Com-piler über den Datentyp einer Variablen zur Verfügung stellen, desto besserkann dieser Fehler rechtzeitig feststellen. So gibt es bei Visual Basic .NET die

Object 4 – Dies ist der Stan-darddatentyp, den eine Vari-able immer dann erhält, wenn kein Datentyp bei der Deklara-tion angegeben wird.

System.Object

Short 2 –32.768 bis +32.767 Bei Visual Basic 6.0 war dies der Datentyp Integer.

System.Int16

Single 4 Bis zu sieben Nachkommastellen (der genaue Bereich muss der Hilfe entnommen werden).

Die Genauigkeit beträgt maximal sieben Stellen nach dem Komma.

System.Single

String – 0 bis ca. 2 Milliarden Unicode-Zeichen.

Strings sind bei Visual Basic .NET Objekte der String-Klassea.

System.String

a. Das gilt für alle Typen, ein Integer ist ein Objekt der Int32-Klasse.

Daten-typ

Anzahl Bytes

Wertebereich Anmerkung .NET-Datentyp

Page 89: Jetzt lerne ich Visual Basic.NET  GERMAN

89

Die Merkmale einer Variablen

Möglichkeit einzustellen (über den Befehl Option Strict On), dass nur Variab-len einander zugewiesen werden dürfen, die den gleichen Datentyp besitzen– ansonsten muss entweder die CType-Funktion als »Dolmetscher« benutztwerden oder ein Laufzeitfehler ist die Folge. Diese strenge Typüberprüfungführt zwar zu fehlerfreieren Programmen, verlangt aber auch mehr Disziplinund Tipparbeit vom Programmierer. Anfänger sind davon im Allgemeinennicht besonders begeistert (einige alte Hasen, die im Laufe der Zeit etwas be-quem geworden sind oder der Meinung sind, das war immer schon so und solldaher auch so bleiben) ebenfalls nicht. Grundsätzlich ist die strenge Typüber-prüfung aber eine wichtige Angelegenheit.

Wie kann die strenge Typüberprüfung aktiviert werden? Auf drei verschiede-ne Weisen:

� Über den Befehl Option Strict On, der zu Beginn eines Programms ste-hen muss – diese Option ist dann interessant, wenn das Programm mitNotepad oder einem anderen Editor eingetippt wird.

� Über die entsprechende Einstellung in den Projekteigenschaften derVisual Studio .NET-Entwicklungsumgebung. Diese Einstellung gilt dannfür alle Dateien im Projekt.

� Über die Kommandozeilenoption /optionstrict+ beim Aufruf des VisualBasic .NET-Compilers Vbc.exe.

3.2.3 Die Rolle des Gültigkeitsbereichs: Wo werden Variablen in einem Programm deklariert?

Neben einem Namen, einem Datentyp und einem Wert besitzt jede Variableauch einen Gültigkeitsbereich (engl. »scope«). Der Gültigkeitsbereich einerVariablen gibt an, in welchem Bereich des Programms (bei .NET muss mangenau genommen von einem Assembly sprechen) die Variable »gültig« ist, dasheißt angesprochen werden kann. Das wiederum führt direkt zur Frage, anwelchen Stellen eine Variable in einem Visual Basic .NET-Programm definiertwerden kann. Es gibt drei unterschiedliche »Orte«:

� Innerhalb eines »Blocks« (etwa dem Bereich zwischen einem If- und einemElse-Befehl).

� Innerhalb einer Funktion (oder Prozedur).

� Außerhalb einer Funktion (oder Prozedur), aber innerhalb einer Klasse.

Je nachdem, an welchem Ort die Variable definiert wird, ist sie von anderenFunktionen oder Klassen aus ansprechbar. Der Ort, an dem eine Variable de-finiert wird, bestimmt daher ihren Gültigkeitsbereich. Für Programmierein-steiger ist dieser Aspekt nicht ganz einfach zu verstehen. Doch keine Sorge,dahinter steckt (wie fast immer) ein sehr einfaches Konzept. Da der Gültig-

Page 90: Jetzt lerne ich Visual Basic.NET  GERMAN

90

Visual Basic .NET-Einmaleins3keitsbereich einer Variablen aber erst bei etwas größeren Programmen eineRolle spielt, die aus mehreren Klassen oder Prozeduren bestehen, wird diesesThema auf Kapitel 10 verschoben.

Schauen Sie sich dazu die folgende simple Prozedur an (Prozeduren sind erstin Kapitel 5 an der Reihe), die einen eigenen Bereich (also einen Gültigkeits-bereich) des Programms darstellt.

Sub P1 () Dim WertP1 As ShortEnd Sub

Die Prozedur enthält zu Anschauungszwecken nur einen Befehl, der eine Va-riable deklariert. Kann diese Variable auch von einer anderen Prozedur ausabgefragt werden oder einen Wert erhalten? Die Antwort lautet Nein, da dieVariable WertP1 nur innerhalb der Prozedur P1 gültig ist. Ihr Gültigkeits-bereich beschränkt sich auf die Prozedur. Wird die Variable in einer ProzedurP2 angesprochen, ist eine Fehlermeldung die Folge. Der Compiler tut so, alswäre die Variable nicht bekannt. Dies geschieht aber nicht, um den Program-mierer zu ärgern oder um alles so richtig schön kompliziert zu machen. ImGegenteil, diese strikte Trennung soll dazu beitragen, dass Programme fehler-freier werden, da auf diese Weise der Fall ausgeschlossen wird, dass der Werteiner Variablen geändert wird, die vielleicht nicht geändert werden sollte. Pro-zeduren sind geschlossene Einheiten – es darf nicht möglich sein, von »außen«(d.h. von einer anderen Prozedur aus) auf interne Variablen der Prozedur zu-zugreifen. Und es gibt noch einen zweiten Grund. Da der Gültigkeitsbereichein zusätzliches Unterscheidungsmerkmal ist, können mehrere Variablen dengleichen Namen tragen, wenn sie sich in ihrem Gültigkeitsbereich unterschei-den.

3Das folgende Beispiel definiert die Variable Wert zweifach. Es gibt aber keinProblem, da beide Variablen in verschiedenen Bereichen des Programms de-klariert werden und dadurch (automatisch) einen unterschiedlichen Gültig-keitsbereich besitzen.

Sub P1 () Dim Wert As IntegerEnd Sub

Sub P2 () Dim Wert As ShortEnd Sub

Die verschiedenen Gültigkeitsbereiche in einem Programm

Der Gültigkeitsbereich einer Variablen wird entweder direkt über die BefehlePrivate und Public festgelegt oder er ergibt sich indirekt aus der Position derVariablen im Programm. Hier gibt es mehrere Möglichkeiten:

Page 91: Jetzt lerne ich Visual Basic.NET  GERMAN

91

Die Merkmale einer Variablen

� Die Variable wird innerhalb einer Prozedur mit dem Dim-Befehl dekla-riert. In diesem Fall ist ihr Gültigkeitsbereich auf die Prozedur beschränkt(man spricht auch von einer lokalen Variablen).

� Die Variable wird außerhalb einer Prozedur aber innerhalb einer Klasseoder eines Moduls deklariert (neben dem Dim-Befehl sind in diesem Fallauch die Befehle Private und Public erlaubt). In diesem Fall ist die Variablein allen Funktionen und Prozeduren der Klasse gültig.

� Die Variable wird außerhalb einer Prozedur (und damit innerhalb einerKlasse) mit dem Public-Befehl deklariert. In diesem Fall ist die Variableauch von anderen Modulen und Assemblies (also von anderen Program-men aus) ansprechbar. (Voraussetzung ist allerdings, dass beim Kompilie-ren der anderen Programme ein Verweis auf dieses Programm mit der öf-fentlichen Variablen eingefügt wird.)

3Das folgende Beispiel soll die Bedeutung des Gültigkeitsbereichs von Variab-len veranschaulichen. Es enthält insgesamt drei Klassen und eine Variable mitdem Namen GlobalLevel.

Wenn Sie das Listing mit dem Kommandozeilencompiler kompilieren, mussdie Option /rootnamespace:M1 übergeben werden, die den NamensraumM1 definiert (der Name selber spielt keine Rolle). Der Aufruf muss daher inder Form

vbc.exe mit /rootnamespace.M1

erfolgen. Wenn Sie mit Visual Basic .NET arbeiten, wird automatisch einHauptnamensraum angelegt, der dem Namen des Projekts entspricht.

Listing 3-1:Gültigkeits-bereich bei Variablen

' -------------------------------------' Gültigkeitsbereich von Variablen' Jetzt lerne ich Visual Basic .NET-Beispiel' -------------------------------------Imports SystemImports System.ConsoleImports CTest1

Class CTest1 Public Shared GlobalLevel As IntegerEnd Class

Class CTest2 Shared Sub ChangeWert() GlobalLevel = 123 End SubEnd Class

Buch-CD: vbnet0301.vb

Page 92: Jetzt lerne ich Visual Basic.NET  GERMAN

92

Visual Basic .NET-Einmaleins3Class CTest3 ' Erweiterung 1: Den folgenden Befehl einfügen ' Shared GlobalLevel As Short Shared Sub Main() CTest2.ChangeWert() WriteLine("Der Wert ist: {0}", GlobalLevel) GlobalLevel = 456 CTest2.ChangeWert() WriteLine("Der Wert ist: {0}", GlobalLevel) WriteLine("Alles klar mit .NET") ReadLine() End SubEnd Class

Dadurch, dass die Variable GlobalLevel in der Klasse CTest1 mit Public de-klariert wird (der Zusatz Shared sorgt lediglich dafür, dass es eine gemeinsameVariable ist und die Klasse nicht instanziert werden muss, um die Variable an-sprechen zu können), kann sie auch in der dritten Klasse angesprochen wer-den. Entfernen Sie den Kommentar in der Klasse CTest3, ergibt sich eine Än-derung. Nun wird mit dem Private-Befehl eine weitere Variable mit demNamen GlobalLevel deklariert. Dieses Mal als Variable, deren Gültigkeitsbe-reich auf die Klasse beschränkt ist. Da sie sich dadurch in einem anderen Gül-tigkeitsbereich befindet, gibt es keine Probleme. Die Prozedur ChangeWertändert aber nach wie vor die globalere Variable und nicht jene, die in der Klas-se CTest3 deklariert wird.

Tabelle 3.2 zeigt die wichtigsten Gültigkeitsbereichsmodifizierer, die in einemVisual Basic .NET-Programm vorkommen können. Eine ausführliche Be-schreibung finden Sie in der Hilfe.

Tabelle 3.2:Alternative fürdie Angaben ei-nes Gültigkeits-

bereichs

3.2.4 Die Rolle der Lebensdauer einer Variablen

Drei Merkmale einer Variablen kennen Sie bereits: Name, Datentyp und Gül-tigkeitsbereich. Sie werden es nicht glauben, aber es gibt bei Variablen nochein viertes Merkmal. Dies ist die Lebensdauer (engl. »lifetime«). Sie gibt an, wielange der Wert einer Variablen erhalten bleibt. Normalerweise geht der Wert

Gültigkeitsbereiche Von wo kann die Variable angesprochen werden?

Public Von anderen Modulen und Assemblies.

Protected Nur von Klassen, die von der Klasse, die die Variable ent-hält, abgeleitet wurden.

Friend Nur innerhalb des Assemblies, nicht von anderen Assem-blies aus.

Private Nicht außerhalb der Klasse, in der die Variable definiert wird.

Page 93: Jetzt lerne ich Visual Basic.NET  GERMAN

93

Charakterfest und beständig: die Konstanten

der Variablen verloren, wenn die Variable ihren Gültigkeitsbereich verliert. Esgibt jedoch zwei Ausnahmen:

� Die Variable wird mit Static als statisch deklariert. Statische Variablen gibtes nur innerhalb von Prozeduren. Sie behalten ihren Wert bei, nachdemdie Prozedur verlassen und die Variable nicht mehr gültig ist. Wird die Pro-zedur das nächste Mal aufgerufen, erhält die Variable automatisch wiederden Wert, den sie vor dem Verlassen der Prozedur besaß.

� Es handelt sich um eine gemeinsame Variable innerhalb einer Klasse. Die-se Variablen werden mit Shared deklariert. Die Variable kann benutzt wer-den, ohne dass die Klasse instanziert werden muss. Sie sind also auchdann ansprechbar, wenn keine Instanz der Klasse existiert.

3.3 Charakterfest und beständig: die Konstanten

Konstanten sind Variablen, die, während das Programm läuft, ihren Wertnicht ändern können. Diese Erklärung ist zwar nicht ganz logisch, hoffentlichaber verständlich. Konstanten erfüllen in erster Linie eine Aufgabe: Wenn ineinem Programm eine Zahl oder ein Wort öfter vorkommt, ist es zweckmäßig,dafür eine Konstante zu benutzen. Das bietet zwei Vorteile: 1. Das Programmwird besser lesbar, da ein Name aussagekräftiger ist als eine Zahl. 2. Solltesich der Wert der Zahl bzw. allgemein der Wert doch ändern, muss die Ände-rung nur einmal im Programm, bei der Deklaration der Konstanten, erledigtwerden.

Hier ein kleines Beispiel: Ein Physiker überarbeitet gerade die allgemeine Re-lativitätstheorie und hat dafür ein Visual Basic-Programm entwickelt, bei demdie Lichtgeschwindigkeit mindestens ein Dutzend Mal vorkommt. Da er gera-de einen Visual Basic-Kurs besucht hat, verwendet er eine Konstante für dieLichtgeschwindigkeit, was naheliegend ist, da es sich bei der Lichtgeschwin-digkeit (so glauben es die meisten Physiker jedenfalls) um eine Konstante han-delt. Kurz vor der Fertigstellung seiner Theorie gelingt einem anderen Physi-ker (der alles noch in C programmiert) der Beweis, dass die (vermeintlichkonstante) Lichtgeschwindigkeit nicht 299792,458, sondern 299792,459lautet. Statt sich zu ärgern, muss der erste Physiker nur die Stelle ändern, ander die Konstante ihren Wert erhält, und das Programm läuft fehlerfrei durch.

Eine Konstante wird über den Const-Befehl definiert, auf den gegebenenfallsein Datentyp und der Wert der Konstanten folgen.

3Const Licht = 299792,458

Auch Konstanten besitzen einen Datentyp (das wird auch von erfahrenenProgrammierern häufig übersehen). Dieser spielt aber keine so wichtige Rolle

Page 94: Jetzt lerne ich Visual Basic.NET  GERMAN

94

Visual Basic .NET-Einmaleins3wie bei den Variablen, da der Compiler mit einer Konstanten weniger »Arbeit«hat. Außerdem erhält eine Konstante immer einen Datentyp, der zu ihremWert am besten passt, da der Wert anders als bei Variablen nicht offen gelas-sen werden kann.

3Die folgende Deklaration würde auch ohne den Datentyp gut funktionieren.Er kann aber trotzdem sinnvoll sein, wenn der Programmierer damit an-deuten will, dass der Datentyp eine Rolle spielt oder Visual Basic .NET einenanderen Datentyp verwenden soll als jenen, den es ursprünglich verwendethätte.

3Durch die folgende Deklaration erhält die Konstante nicht den DatentypDouble, sondern Decimal.

Const Licht As Decimal = 299792.458

3.3.1 Auch Zahlenwerte sind Konstanten

Jede Zahl, die in einem Ausdruck vorkommt, ist eine Konstante. Es ist einebesondere und recht interessante Eigenschaft, dass auch eine simple Zahl alsObjekt betrachtet wird (denken Sie an das Mantra Nr. 1 aus Kapitel 3 »Allesist ein Objekt«). Das führt zu seltsamen Konstruktionen, die natürlich für dieProgrammierung keine Rolle spielen, die aber dennoch erlaubt sind.

3Das folgende Beispiel wandelt die Zahl 5 über die Methode ToString, über diejedes Objekt verfügt, in ihren Zeichenkettenwert um. Das Ergebnis ist zwarwieder 5, für eine Programmiersprache ist dies aber trotzdem ungewöhnlich.Es ist möglich, da selbst einfache Zahlen bei Visual Basic .NET Objekte sind.

?5.ToString

3.3.2 Zeichenkettenkonstanten

Eine besondere Sorte von Konstanten sind die Zeichenkettenkonstanten(manchmal auch Literale genannt). Eine Zeichenkettenkonstante ist eine Kon-stante, deren Wert eine Zeichenkette ist. Der Wert einer Zeichenkettenkons-tanten wird bei Visual Basic .NET immer in Anführungsstriche gesetzt.

3Const Mantra_Nr1 As String = "Alles ist ein Objekt"

Durch diese Definition kann die Konstante Mantra_Nr1 überall im Pro-gramm statt der sehr viel längeren Zeichenkette eingesetzt werden. DerHauptvorteil ist auch hier: Wenn der Konstante eine andere Zeichenkette zu-gewiesen wird, bezieht sich dies selbstverständlich auf alle Stellen im Pro-gramm, an denen der Name der Konstanten auftaucht. Wie es für Variablenüblich ist, erhält auch die Konstante einen Datentyp (in diesem Fall ist esString).

Page 95: Jetzt lerne ich Visual Basic.NET  GERMAN

95

Regeln für Bezeichner

3.4 Regeln für Bezeichner

Auch dieses Thema muss irgendwo einmal erwähnt werden, die Regeln fürBezeichner. Bezeichner? Die kamen bislang doch noch gar nicht vor. Nun,Bezeichner ist ein allgemeiner Begriff für Variablennamen, Konstantenna-men, Klassennamen usw. Ein Bezeichner ist ein Name, der etwas bezeichnet.Und dafür gibt es bei Visual Basic .NET einfache Regeln, die wie folgt lauten:

� Bezeichner müssen mit einem Buchstaben beginnen und dürfen keinLeerzeichen beinhalten.

� Eine Reihe von Sonderzeichen (wie !, $, %, &, # und @) sind im Variab-lennamen nur dann erlaubt, wenn kein Datentyp angegeben wird, da sieselbst den Datentyp festlegen – eine Programmierkonvention, die aberkaum noch verwendet wird.

� Die maximale Länge für einen Bezeichner ist 254.

3.5 Spezialisten fürs Rechnen: die Operatoren

Wie es sich für eine Programmiersprache gehört, kann Visual Basic .NETganz prima rechnen. Neben den Funktionen der .NET-Klassen, die sich vorallem um spezielle Berechnungen kümmern, gibt es wie bei jeder Program-miersprache Operatoren. Ein Operator dient dazu, zwei Ausdrücke miteinan-der zu einem Ergebnis zu kombinieren (einige wenige Operatoren arbeitenmit einem Operanden, sie heißen daher unäre Operatoren). Das beste Bei-spiel für einen Operator ist der +-Operator, der zwei Ausdrücke addiert:

4+5

Das ist ein Ausdruck, der aus zwei Operanden und einem Operator besteht.Es handelt sich aber nur um einen Ausdruck und nicht um einen vollständigenBefehl. Vollständig ist der Befehl erst im Rahmen einer Zuweisung, um die esim nächsten Abschnitt geht.

Tabelle 3.3:Die Operato-ren von Visual Basic .NET in der Übersicht in der Reihen-folge ihrer Priorität

Operator Bedeutung

^ Potenzierung (z.B. 2 ^3 = 8)

+, – Vorzeichen

*, / Multiplikation, Division

\ Integer-Division

Mod Rest einer Division

Page 96: Jetzt lerne ich Visual Basic.NET  GERMAN

96

Visual Basic .NET-Einmaleins3

3.5.1 Ein kleiner Ausflug in die Mathe-Klasse

Keine Sorge, Sie müssen in diesem Abschnitt nicht das Geodreieck heraus-kramen oder sich mit dem induktiven Beweis von n abgebildet auf n+1 be-schäftigen. Es geht lediglich um die (völlig harmlose) Frage, ob sich dieRechentalente von Visual Basic .NET auf die Durchführung simpler Arithme-tikoperationen beschränken. Selbstverständlich nicht, allerdings ist für alles,das über die Grundrechenarten hinausgeht, die .NET-Basisklasse Math zu-ständig. Wie es Kapitel 6.10 erläutern wird, muss diese Klasse weder einge-bunden noch importiert werden. Sie steht als Teil der Laufzeitumgebung im-mer zu Diensten. Je müssen Sie nur noch wissen, welche Methoden (sowerden die Funktionen einer Klasse auch genannt) sich in dieser Klasse ver-bergen, und schon kann es losgehen. (Eine Übersicht über die wichtigstenFunktionen der nicht allzu umfangreichen Klasse enthält Tabelle 3.4.)

3Das folgende kleine Beispiel zeigt eine Anwendung für die Math-Klasse, indem es die Quadratwurzel einer Zahl auf zwei Stellen nach dem Komma run-det.

Imports System.Math

Dim dbErgebnis As DoubledbErgebnis = Round(Sqrt(22), 2)

Der Imports-Befehl am Anfang ist nicht zwingend notwendig. Er vereinfachtdie Programmierung ein wenig, da so nicht jedem Mitglied der Math-Klasseder Name der Klasse vorangestellt werden muss.

Tabelle 3.4:Die wichtigstenMitglieder der

Math-Klasse

+, - Addition, Subtraktion

& Zusammenfügen von Zeichenketten

=, <>, <, >, <=, >=, Like, Is, TypeOf…Is

Vergleichsoperatoren

Not Logische Umkehrung

And, AndAlso Logische UND-Verknüpfung

Or, OrElse Logische ODER-Verknüpfung

Xor Logische XOR-Verknüpfung (Entweder-Oder-Verknüpfung)

Operator Bedeutung

Mitglied Bedeutung

Abs Gibt den Absolutwert zurück.

Cos Berechnet den Cosinus eines Winkels, der im Bogenmaß übergeben wurde.

E Konstante, die für die Eulersche Zahl steht.

Page 97: Jetzt lerne ich Visual Basic.NET  GERMAN

97

Spezialisten fürs Rechnen: die Operatoren

3.5.2 Zuweisungen

Einige Dinge sind so trivial, dass sie oft gar nicht erwähnt werden. Die Zuwei-sungen gehören auch dazu. Bei einer Zuweisung erhält eine Variable einenWert. Der Wert ist ein Ausdruck, d.h., es kann sich um eine einzelne Zahloder ein Mix aus Zahlen, Operatoren, Variablen und Funktionen handeln, dieeinen einzigen Wert ergeben.

3Ergebnis = 4 + 5

Es ist wichtig zu verstehen, dass auf der linken Seite der Zuweisung immereine Variable stehen muss (man spricht auch von einem L-Wert). Auf derrechten Seite stehen dagegen ein Ausdruck und kein Befehl (man spricht auchvon einem R-Wert). Umgekehrt geschrieben wäre der Befehl nicht erlaubt:

4 + 5 = Ergebnis

Diese Schreibweise verstößt gegen die Syntax von Visual Basic .NET1. DieSyntax einer Sprache ist ein Satz von Regeln, der festlegt, was erlaubt ist undwas nicht. Geben Sie einen Befehl ein, der gegen eine Syntaxregel verstößt,ist ein Syntaxfehler die Folge.

Wenn Sie gerade mit dem Programmieren beginnen, ist es wichtig, sich aneinfache Regeln zu halten und diese vor allem zu kennen. Wenn Sie sich nichtsicher sind, wie ein Befehl geschrieben wird, denken Sie z.B. an die Regel »Va-riable muss immer links stehen-Regel« (VMILSR). Eine andere Regel besagt,dass auf einen Objektnamen immer ein Punkt folgt. Eine dritte Regel legt fest,dass Variablen immer einen Datentyp erhalten usw. Mit diesen einfachenRegeln lassen sich schon ein paar der typischen Anfängerfehler vermeiden.

Exp Exponentialfunktion.

Floor Gibt die nächstkleinere Ganzzahl einer Zahl mit Nachkommaanteil zurück (entspricht der Int-Funktion früherer Visual Basic-Versionen).

Log10 Berechnet den Logarithmus zur Basis 10.

PI Konstante, die für die Kreiszahl steht.

Pow Berechnet die Potenzierung einer Zahl mit einer anderen Zahl.

Round Rundet eine Zahl mit Nachkommaanteil (auf Wunsch auf eine bestimmte Anzahl an Stellen).

Sign Gibt das Vorzeichen einer 8-Bit-Integer-Zahl zurück.

Sin Berechnet den Sinus eines Winkels, der im Bogenmaß übergeben wurde.

Sqrt Berechnet die Quadratwurzel einer Zahl.

Mitglied Bedeutung

1. Es mag andere Programmiersprachen geben, in denen eine solche Schreibweise nicht nurerlaubt ist, sondern unter den Programmierern auch als ziemlich cool gilt.

Page 98: Jetzt lerne ich Visual Basic.NET  GERMAN

98

Visual Basic .NET-Einmaleins33.5.3 Alles genau nach Vorschrift:

die Operatorreihenfolge

Kommen in einem Ausdruck mehrere Operatoren vor, gibt es bei Visual Basic.NET eine genaue Reihenfolge, nach der sie alle abgearbeitet werden. Dieerste Regel kennen Sie noch aus der Schule. Es ist die Punkt-vor-Strich-Regel.Der folgende Ausdruck ergibt daher 7 und nicht 10:

?3 + 2 * 2

Etwas diffiziler wird es, wenn logische Operatoren im Spiel sind. Auch einigeerfahrene Programmierer wissen nicht unbedingt, dass der Not-Operatoreine geringere Priorität besitzt als etwa der Additionsoperator. Welches Er-gebnis besitzt daher der folgende Ausdruck?

?Not 2 + 3

Die Umkehrung von 2 ergibt –3 (indem alle Bits umgedreht und das so ge-nannte Zweierkomplement gebildet wird – das Zweierkomplement wird ge-bildet, indem man alle Bits »umdreht« und anschließend noch 1 addiert). An-statt 0 ergibt die Operation aber –6, da zuerst die Addition und anschließenddie logische Umkehrung durchgeführt wird. Das sind zwar relativ selten auf-tretende Situationen, dennoch ist es für einen Programmierer wichtig zu wis-sen, in welcher Reihenfolge Ausdrücke ausgewertet werden.

03.5.4 Kombiausdrücke: Zuweisung und Operator

in einem

Visual Basic .NET bietet seinen Programmierern eine Gruppe von Operato-ren, die lediglich dazu dienen, etwas Tipparbeit zu sparen. Dazu gehört derrecht praktische +=-Operator, der eine Addition mit einer Zuweisung kombi-niert.

3Zahl += 1

Diese Zuweisung bewirkt, dass der Wert von Zahl um eins erhöht wird. Es istsozusagen die Abkürzung von

Zahl = Zahl + 1

Vorsicht, achten Sie auf die Reihenfolge. Was bewirkt wohl der folgende Be-fehl?

Zahl =+ 1

Wenn Sie sich in komplexeren Ausdrücken bezüglich der Auswertungsrei-henfolge unsicher sind, verwenden Sie Klammern. Ausdrücke in Klammernwerden immer als Erstes ausgewertet.

Page 99: Jetzt lerne ich Visual Basic.NET  GERMAN

99

Wahr oder falsch? – die Welt der logischen Verknüpfungen

Lassen Sie sich von dem Umstand nicht täuschen, dass der Zuweisungs- undder Additionsoperator so nahe beieinander stehen. Visual Basic .NET ver-steht den Befehl als simple Zuweisung:

Zahl = 1

Und da wir gerade bei etwas skurrileren Beispielen sind, auch der folgendeBefehl ist erlaubt und verstößt nicht gegen die Syntaxregeln:

Zahl =+++ 1

Die vielen Additionsoperatoren bringen Visual Basic .NET nicht durcheinan-der, denn es versteht das Pluszeichen nicht als eine Addition, sondern als den»unären« Vorzeichenoperator. Das kennen Sie noch aus der Schule, dreimalPlus gibt am Ende immer noch Plus. Anders sieht es im folgenden Fall aus.Welchen Wert erhält Zahl wohl durch diesen Befehl?

Zahl =+-+-- 1

Hier geht es nur um das Vorzeichen, dass durch jeden Minusoperator umge-dreht wird. Am Ende kommt –1 heraus.

3.6 Wahr oder falsch? – die Welt der logischen Verknüpfungen

Alle Informationen, die ein Computer verarbeitet, werden intern binär, d.h.als eine schier endlose Folgen von Binärzahlen dargestellt. Eine Binärzahl isteine Zahl, deren Ziffern nur zwei Werte annehmen können: 0 und 1. Daherauch der Begriff Binärzahl (früher war der Begriff Dualzahl geläufiger). JedeZiffer einer Binärzahl wird als Bit bezeichnet und ist die kleinste denkbare In-formationseinheit. Die provokante Behauptung, dass das ausdrucksvollste inWord eingegebene Gedicht, das eingescannte Kunstwerk oder eine aus demInternet als MP3 heruntergeladene Ode an die Lebensfreude aus der Sicht desComputers nichts anderes ist als eine gewaltige Menge gleich aussehender,nüchterner Bits, wird in zahllosen Computerbüchern bewiesen. Falls Sie esnoch nicht wussten, müssen Sie es an dieser Stelle einfach glauben. Damit derbinäre Eintopf leichter zu verarbeiten ist, werden die binären Daten in kleinePortionen aufgeteilt. Acht Bit bilden ein Byte, 1.024 Byte ein Kilobyte(Kbyte), 1.024 Kbyte ein Megabyte (Mbyte), 1.024 Mbyte ein Gigabyte(Gbyte) usw. Nur wenige wissen, dass ein 1.000 Seiten starkes Buch geradeeinmal 2 Mbyte umfasst (mit einem kleineren Bild pro Seite) und damit kom-primiert vielleicht gerade noch auf eine Diskette passen könnte (1,44 MbyteKapazität). Als die Computerrevolution in den achtziger Jahren begann, re-deten alle über Kbyte, heute ist die größte gebräuchliche Einheit Gbyte1. AlleComputerbesitzer kennen diese Größeneinheiten in und auswendig. Ein MP3aus dem Internet eines fünfminütigen Songs umfasst (je nach Aufnahmequa-

Page 100: Jetzt lerne ich Visual Basic.NET  GERMAN

100

Visual Basic .NET-Einmaleins3lität natürlich) etwa 8 Mbyte, ein mit DivX (raub-)kopierter DVD-Spielfilm um-fasst knapp 700 Mbyte (und passt damit gerade noch auf eine CD-ROM) undbeim Brennen einer CD muss auf der Festplatte die doppelte Kapazität freisein, also 1,2 Gbyte.

In diesem Abschnitt soll es aber nicht um Größeneinheiten oder gar den Char-me längst vergangener Zeiten gehen, sondern um die Frage, wie sich einByte, das aus einer Gruppe von 8 Bit besteht, mit einem anderen Byte ver-knüpfen lässt. Es geht um die logischen Grundverknüpfungen. Solche Ver-knüpfungen treten in zwei vollkommen unterschiedlichen Situationen auf:

� Im Rahmen einer Entscheidung (z.B. If-Befehl) sollen mehrere Ausdrückekombiniert werden (ein Bankautomat zahlt nur Geld aus, wenn die Ge-heimnummer stimmt UND das Konto ein ausreichendes Guthaben auf-weist).

� Im Rahmen einer Bitoperation sollen einzelne Bits in einem Byte (also ei-ner Zahl) gesetzt oder abgefragt werden. In den »guten alten Tagen« derProgrammierung war diese Praxis gang und gäbe, da viele Hardwarekom-ponenten durch Setzen oder Rücksetzen einzelner Bits in einem Hard-wareregister kontrolliert wurden. Bei Visual Basic .NET haben solche»Kunststücke« eher Seltenheitswert (wenngleich die .NET-Basisklassen mitder BitArray-Klasse eine Feldvariable anbieten, auf die bitweise zugegrif-fen werden kann).

Die folgenden Beschreibungen der logischen Verknüpfungen mit den Opera-toren And, Or, Xor und Not haben daher eher »akademischen« Charakter.Dennoch sind sie wichtig, da sie zu den Grundoperationen praktisch jederProgrammiersprache gehören. Allen logischen Verknüpfungen ist gemein-sam, dass sie bitweise durchgeführt werden. Um ihre Wirkung zu verstehenmüssen Sie sich daher die beteiligten Operanden als eine Aneinanderreihungvon Operatoren vorstellen, die jeweils zwei Bits nach der stets gleichen Regelmiteinander verknüpfen, nach der ein einzelnes Ergebnisbit resultiert. Die ein-zelnen Ergebnisbits aneinander gereiht ergeben dann das Ergebnis der logi-schen Verknüpfung.

3.6.1 Die Und-Verknüpfung mit dem And-Operator

Mit dem And-Operator werden die Bits nach den Regeln der Und-Verknüp-fung verknüpft. Diese besagt, dass das Ergebnisbit nur dann 1 ist, wenn beideverknüpften Bits ebenfalls 1 sind. Ansonsten ist das Ergebnis 0.

1. Wenn Sie das für viel halten, rufen Sie bei Windows 2000/XP einmal den Eigenschaftendia-log der Datenträgerkontingenteeinstellungen eines Laufwerks auf. Hier werden in einemListenfeld Terabyte, Petabyte und sogar Exabyte als Einheiten angeboten. Selbst die NASAdürfte keine so großen Laufwerke im Einsatz haben.

Page 101: Jetzt lerne ich Visual Basic.NET  GERMAN

101

Wahr oder falsch? – die Welt der logischen Verknüpfungen

3?10 And 72

3.6.2 Die Oder-Verknüpfung mit dem Or-Operator

Mit dem Or-Operator werden die Bits nach den Regeln der Oder-Verknüp-fung verknüpft. Diese besagt, dass das Ergebnisbit nur dann 1 ist, wenn beideverknüpften Bits ebenfalls 1 sind. Ansonsten ist das Ergebnis 0.

3?10 Or 715

3.6.3 Die Exklusiv-Oder-Verknüpfung mit dem XOR-Operator

Mit dem Xor-Operator werden die Bits nach den Regeln der exklusiven Oder-Verknüpfung verknüpft. Diese besagt, dass das Ergebnisbit nur dann 1 ist,wenn beide verknüpften Bits unterschiedlich sind. Ansonsten ist das Ergebnis0. Die Xor-Verknüpfung spielt vor allem in der Grafikprogrammierung eineRolle, wenn die Bitmuster zweier Bitmaps überlagert werden sollen.

3?10 Xor 515

3.6.4 Die Negation mit dem Not-Operator

Den Vorwurf, alles negativ zu sehen, muss sich der Not-Operator sicher nichtgefallen lassen, er dreht lediglich alle Bits in einem Operanden um.

?1-2

Wieso ergibt die Umkehrung von 1 denn –2 und nicht –1? Dazu muss mansich lediglich die Umkehrung der einzelnen Bits betrachten. Aus

0 0 0 0 0 0 0 1 (1)

wird

1 1 1 1 1 1 1 0 (254)

Die Zahl 254 ist die binäre Darstellung von –2.

3.6.5 Die kombinierten logischen Operatoren AndAlso und OrAlso

Die Operatoren AndAlso und OrAlso sind ausschließlich für den Fall ge-dacht, dass ein logischer Ausdruck (wie er etwa bei einem If-Befehl vorkom-men kann) aus mehreren Teilen (also Teilausdrucken) besteht. Im Unterschied

Page 102: Jetzt lerne ich Visual Basic.NET  GERMAN

102

Visual Basic .NET-Einmaleins3zum And- bzw. Or-Operator brechen diese Operatoren die Auswertung derfolgenden Teilausdrücke ab, sobald ein Ausdruck den Wert False ergibt. DerVorteil ist, dass sich auf diese Weise voneinander abhängige Ausdrücke aus-werten lassen, ohne dass es zu einer Ausnahme (Laufzeitfehler) kommt, weilein folgender Ausdruck von einer Bedingung ausgeht, die bereits bei einemvorangegangenen Ausdruck nicht erfüllt war. Das klassische Beispiel ist dieEingabeüberprüfung, bei der der erste Teilausdruck prüft, ob eine Zahl einge-geben wurde, und der zweite Teilausdruck feststellen soll, ob die Zahl positivist. Mit dem And-Operator wird der zweite Teilausdruck auch dann ausgewer-tet, wenn gar keine Zahl eingegeben wurde, was in einer Ausnahme resultiert.

Das folgende Beispiel zeigt, wie sich der AndAlso-Operator in der Praxis aus-wirkt. Ist die Eingabe keine Zahl, erscheint eine Fehlermeldung, das Pro-gramm wird nicht aufgrund der nicht möglichen Umwandlung abgebrochen.

3 ' -----------------------------------------------' Beispiel für den AndAlso-Operator' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports SystemImports System.ConsoleImports Microsoft.VisualBasic

Class App Shared Sub Main() Dim sEingabe As String Write("Bitte was eingeben: ") sEingabe = ReadLine() If IsNumeric(sEingabe) = True AndAlso _ CType(sEingabe, Int32) > 0 Then WriteLine("Alles klar!") Else WriteLine("Sorry, das war keine Zahl!") End If ReadLine() End SubEnd Class

Wird nach dem Start des Programms ein nicht numerischer Wert eingegeben,wäre bei Verwendung des And-Operators eine Ausnahme die Folge, da dieCType-Konvertierungsfunktion fehlschlägt. Wird statt des And-Operatorsaber der AndAlso-Operator verwendet, wird die zweite Abfrage nicht mehrausgeführt, da die Abfrage auf IsNumeric (eine Funktion der Microsoft.Visu-alBasic-Kompatibilitätsklasse) einen False-Wert zurückgibt und daher dieAuswertung der folgenden Ausdrücke abgebrochen wird.

Buch-CD: vbnet0302.vb

Page 103: Jetzt lerne ich Visual Basic.NET  GERMAN

103

Eingaben von der Tastatur

3.7 Eingaben von der Tastatur

Die Möglichkeit, Eingaben über die Tastatur entgegenzunehmen, ist beiVisual Basic .NET ein wenig umständlich und zudem recht bescheiden (bei C#ist es genauso). Das erscheint zunächst mehr als verwunderlich, denn eineProgrammiersprache des 21. Jahrhunderts sollte in diesem Punkt etwas mehrauf dem Kasten haben. Der Widerspruch klärt sich auf, wenn man berücksich-tigt, dass an Konsolenanwendungen keine allzu hohen Ansprüche gestelltwerden. Wer Fenster oder Webseiten mit allen Schikanen will, legt statt einerKonsolenanwendung ein Windows- oder Webprojekt an und kann mit wenigAufwand raffinierte Benutzeroberflächen auf den Bildschirm zaubern. Damitbeschäftigt sich aber erst Kapitel 14. In diesem Abschnitt geht es lediglich umdie Frage, wie sich über die Eingabeaufforderung ein beliebiger Wert über dieTastatur entgegennehmen und im Programm weiterverarbeiten lässt. Dafürgibt es zwei Methoden: Read und ReadLine. Beide sind Mitglieder der Sys-tem.Console-Klasse. Während Read nur ein einzelnes Zeichen von der Tas-tatur entgegennimmt und dessen Tastaturcode als Integer zurückgibt, nimmtReadLine eine komplette Zeile, d.h. alle Zeichen bis zum Drücken der Æ-Taste, entgegen und gibt diese als String zurück.

Write("Bitte Namen eingeben: ")stName = ReadLine()WriteLine("Der Name ist {0}", stName)

Bei der Read-Methode gilt es eine Besonderheit zu beachten. Auch wenn sienur ein einzelnes Zeichen von der Tastatur entgegennimmt, kehrt sie erstdann zurück, wenn die Æ-Taste betätigt wurde. Soll lediglich ein einzelnesZeichen entgegengenommen werden (etwa für eine Menüauswahl), muss dieEingabe trotzdem mit der Æ-Taste abgeschlossen werden.

3.8 Ausgaben auf dem Bildschirm

Das, was im letzten Abschnitt über die beschränkten Möglichkeiten der Tas-tatureingabe geschrieben wurde, gilt auch für die Ausgabe. In einer Konsolen-anwendung ist die Kommandozeile das Maß aller Dinge. Alle Ausgaben wer-den Zeile für Zeile erledigt. Grafische Ausgaben gibt es nicht (das heißtnatürlich nicht, dass sie mit Visual Basic .NET nicht möglich sind – es müssenlediglich die System.Windows.Forms-Klassen einbezogen werden, was ameinfachsten im Rahmen einer Windows-Anwendung geschieht). Für die Aus-gabe stellt die System.Console-Klasse die Methoden Write und WriteLinezur Verfügung. Beide unterscheiden sich lediglich durch den Umstand, dassbei WriteLine noch ein Zeilenumbruch ausgegeben wird, so dass alle folgen-den Ausgaben in einer neuen Zeile ausgegeben werden.

Page 104: Jetzt lerne ich Visual Basic.NET  GERMAN

104

Visual Basic .NET-Einmaleins3

3WriteLine("Das musste einmal gesagt werden…")

Oft sollen Werte von Variablen ausgegeben werden, die »irgendwo« in einemSatz auftauchen. Dafür bieten Write und WriteLine ein flexibles Konzept.Anstatt die verschiedenen Bereiche der Ausgabezeile mit Leerzeichen zu un-terteilen und per &-Zeichen zu verknüpfen, werden für die Variablen Platzhal-ter in Form von Zahlen eingefügt, die in geschweifte Klammern gesetzt wer-den. Am Ende der Zeichenkette werden alle Variablen (bzw. allgemeinAusdrücke) aufgeführt, die der Reihe nach für die Platzhalter eingesetzt wer-den sollen.

3Jahre = 10Betrag = 1000 * (5.5/100)^JahreWriteLine("Nach {0} Jahren Laufzeit erhalten Sie {1}€", Jahre, Betrag)

1

3.8.1 Formatierte Ausgaben

Bislang wurden durch die Methoden Write und WriteLine die Ergebnisse ein-fach in der Form ausgegeben, in der sie in der Variablen vorlagen oder vondem Ausdruck zurückgegeben wurden. Oft reicht das jedoch nicht aus, einGeldbetrag soll stets mit zwei Nachkommastellen, eine Zahl vielleicht in derwissenschaftlichen Schreibweise mit Exponent und ein Datum auf eine be-stimmte Weise ausgegeben werden. Man spricht in diesem Fall von einer for-matierten Ausgabe. Formatierung bedeutet, eine Zahl nach einem bestimm-ten Schema in eine Zeichenkette umzuwandeln, die dann ausgegeben wird.Durch Formatierung wird die Zahl 12345.6 als 1.2345,60 € ausgegeben,wobei dies nur ein simples Beispiel ist.

Visual Basic .NET bietet (genau wie bei den mathematischen Funktionen) kei-ne eingebaute Funktion für die formatierte Ausgabe, diese Möglichkeit wirdvielmehr auf verschiedene Weisen zur Verfügung gestellt. Entweder über Ar-gumente, die eine direkte Formatierung unterstützen (indem diese die Schnitt-stelle IFormatable implementieren, wie es bei allen Basisdatentypen der Fallist – dieser Hinweis ist für fortgeschrittenere Leser gedacht), oder über die

Ist Ihnen aufgefallen, dass es für Write und WriteLine insgesamt 17 ver-schiedene Syntaxvarianten gibt. Man sagt, die Methode ist mehrfach über-laden (insgesamt 17 Mal). Dafür gibt es einen einfachen Grund. Neben ver-schiedenen Formatierungsmöglichkeiten existiert für jeden Datentyp eineeigene Variante. Das ist typisch für .NET und ein großer Fortschritt gegen-über vorangegangenen Versionen. Alles, was mit (Daten-)Typen zu tun hat,wird sehr genau genommen. Auch wenn dies am Anfang ein wenig verwir-rend erscheinen mag, ist dies ein großer Pluspunkt, denn hat man sich andiese neue Denkweise erst einmal gewöhnt, erschließen sich viele Bereichevon .NET praktisch von alleine.

Page 105: Jetzt lerne ich Visual Basic.NET  GERMAN

105

Ausgaben auf dem Bildschirm

Ausgabemethode ToString. Die häufigste Methode der Formatierung bestehtdarin, in dem Platzhalter für eine Ausgabe im Rahmen der WriteLine-Metho-de die Formatangabe über einen Doppelpunkt folgen zu lassen. So führt dieAngabe {0:c} zur Ausgabe der Zahl als Währung, während die Angabe{0:####} bewirkt, dass stets vier Nachkommastellen angegeben werden.

3Die folgenden kleinen Beispiele führen verschiedene formatierte Ausgabendurch, wobei das Ergebnis stets mit angezeigt wird.

WriteLine("Ihr Guthaben {0:c}", 12345.6)Ihr Guthaben ? 12.345,601

WriteLine("Ihr Guthaben {0,-6:G}", 12345.6)Ihr Guthaben 12345,6

WriteLine("{0,-8:G} Kontostand", 12.34)12,34 Kontostand

WriteLine("Die Wahlbeteiligung: {0:##.00}", 45.5)Die Wahlbeteiligung: 45,50

WriteLine("Unser Treffen am {0:d}", Now)Unser Treffen am 03.03.2002

Über die Formatierungsangabe »D2«, »D3« lässt sich (auch bei Ganzzahlen)eine Mindestanzahl an Ziffern festlegen:

WriteLine("Die Zahl ist {0:D6}", 123)Die Zahl ist 000123

Es ist faszinierend, wie elegant und flexibel .NET länderspezifische Einstellun-gen integriert. Diese werden unter dem Begriff »culture« zusammengefasstund über die CultureInfo-Klasse eingestellt.

3Das folgende Beispiel gibt das Datum auf Französisch aus. Dazu wird einCultureInfo-Objekt angelegt und über den fest eingebauten Namen »fr-FR«werden die landesspezifischen Einstellungen ausgewählt.

Imports System.Globalization

Dim ci As CultureInfo = New CultureInfo("fr-FR")WriteLine("Unser Treffen am {0}", _ DateTime.Now.ToString("f", ci))

Unser Treffen am dimanche 3 mars 2002 16:26

Die Möglichkeiten zur Formatierung sind äußerst vielseitig und in der Doku-mentation zum .NET-Framework SDK ausführlich beschrieben (dort findenSie auch die verschiedenen Formatbezeichner in Tabellen zusammengefasst).

1. In der Eingabeaufforderung kann das €-Zeichen nicht angezeigt werden – stattdessenerscheint ein ?.

Page 106: Jetzt lerne ich Visual Basic.NET  GERMAN

106

Visual Basic .NET-Einmaleins33.8.2 Ausgaben über die Msgbox-Funktion

Was ist denn mit der beliebten Msgbox-Funktion passiert, die nicht nur in frü-heren Versionen von Visual Basic enthalten ist, sondern auch in VBScript?Sie war doch sehr praktisch, da sie eine kleine Box auf den Bildschirm brach-te, in der sich auch ein Fragezeichen oder Ausrufezeichen anzeigen ließ. Wur-de die Funktion etwa auch abgeschafft oder ist sie etwa nicht kompatibel?Weder das eine noch das andere. Sie gehört lediglich nicht mehr zum Sprach-umfang von Visual Basic .NET; sondern wird als Methode über die Kompa-tibilitätsklasse Microsoft.VisualBasic zur Verfügung gestellt. Für die Program-mierung macht dies keinen Unterschied, da auch diese Klasse (bzw. dasAssembly, in dem sie enthalten ist) ständig zur Verfügung steht. Der Aufrufder Funktion erfolgt auf zwei geringfügig unterschiedliche Weisen. Entwederdurch Voranstellen des Namensraum und der Klasse oder etwas einfacherdurch Verwendung eines Imports-Befehls:

Variante a)

Microsoft.VisualBasic.Msgbox ("Hallo, das geht auch!", _ Microsoft.VisualBasic.MsgBoxStyle.Information)

Auch wenn es ein wenig absurd erscheinen mag, ist es nur logisch, dass auchden Konstanten (in diesem Fall Information) der komplette Namensraum vo-rangestellt werden muss, denn die Konstanten sind nur in diesem Namens-raum definiert und außerhalb unbekannt. Alleine aus diesem Grund ist diezweite Variante die einzige Alternative.

Variante b)

Imports Microsoft.VisualBasic

…Msgbox ("Hallo, das geht auch!", MsgBoxStyle.Information)

Auch wenn es erfahrungsgemäß nicht ganz einfach ist, auf liebgewonneneGewohnheiten zu verzichten, und auch wenn selbstverständlich grundsätzlichnichts dagegen spricht, sollte die Msgbox-Methode in Konsolenanwendungenzugunsten der WriteLine-Methode nicht mehr benutzt werden.

Beide Methoden unterscheiden sich auch in der Art und Weise, wie Variableneingebaut werden. Bei WriteLine gibt es dafür die geschweiften Klammern,die für Platzhalter stehen. Diese gibt es bei der Msgbox-Methode nicht, hiermuss die auszugebende Zeichenkette vielmehr Stück für Stück zusammenge-setzt werden. Bei der Msgbox-Funktion muss eine Formatierung zudem überdie ToString-Methode erledigt werden.

Page 107: Jetzt lerne ich Visual Basic.NET  GERMAN

107

Der allgemeine Aufbau eines Visual Basic .NET-Programms

3Das folgende Beispiel führt eine Ausgabe einmal mit der WriteLine- und einweiteres Mal mit der Msgbox-Methode durch.

WriteLine("Zeitdifferenz: {0:0.00}s", Timer() - VBZeit)

MsgBox("Zeitdifferenz: " & (Timer() - VBZeit).ToString("0.00s"), _ MsgBoxStyle.Information, " Geschwindigkeitstest")

Achten Sie darauf, dass die ToString-Methode, über die jedes (!) Objekt ver-fügt, auch einen Formatstring erhalten kann. Die Formatbezeichner sind inder Hilfe beschrieben. Auf diese Weise lässt sich recht flexibel festlegen, inwelchem Format sich ein Objekt ausgeben soll. Ist .NET nicht toll?

3.8.3 Die InputBox-Funktion zur Eingabe

Auch die InputBox-Funktion früherer Visual Basic-Versionen wird bei .NETüber die Microsoft.VisualBasic-Klasse zur Verfügung gestellt. Sie wird ledig-lich der Vollständigkeit halber erwähnt, da sie nicht den optimalen Weg dar-stellt, Eingaben vom Anwender entgegenzunehmen.

3Imports Microsoft.VisualBasic

Dim sName As String = InputBox("Identifizieren Sie sich:", , "Noname")

3.9 Der allgemeine Aufbau eines Visual Basic .NET-Programms

Visual Basic .NET-Programme besitzen stets einen einheitlichen Aufbau –darüber darf auch der Umstand nicht hinwegtäuschen, dass Visual Studio.NET eine Vielzahl von Projekttypen anbietet. Egal, welcher Projekttyp ge-wählt wird, besteht ein Visual Basic .NET-Programm aus einer Reihe vonKlassen, die alle in einer Datei zusammengefasst oder auf mehrere Dateienverteilt sind. Handelt es sich um eine Exe-Datei, muss es in einer Klasse eineProzedur mit dem Namen Main geben (sie muss mit Shared deklariert wer-den). Diese Prozedur legt den Einsprungspunkt, d.h. den Startpunkt des Pro-gramms, fest. Das folgende Listing stellt einen allgemeinen Programmrah-men dar, der in diesem Buch bislang schon mehrfach verwendet wurde.

Option Strict OffImports System

Class App

Page 108: Jetzt lerne ich Visual Basic.NET  GERMAN

108

Visual Basic .NET-Einmaleins3Shared Sub Main ()

End Sub

Class Zwei

End Sub

Es ist wichtig zu verstehen, dass dieser allgemeine Rahmen nicht nur für Kon-solenanwendungen gilt, die in diesem Buch den Schwerpunkt bilden. Er giltallgemein für jedes Visual Basic .NET-Programm, ob es nun als Konsolenan-wendung, Windows-Anwendung oder Web Service läuft. Die von Fall zu Fallbenötigte zusätzliche Funktionalität wird einfach dadurch hinzugefügt, dassdie »Hauptklasse« des Programms von den jeweiligen .NET-Basisklassen erbt,d.h. diese Klassen erweitert. Dieses leistungsfähige Konzept, das Visual Basic.NET-Programmierer auch für ihre eigenen Programme verwenden können,wird in Kapitel 11 vorgestellt.

3.9.1 Die Rolle der Visual Basic .NET-Module

Moment, viele Visual Basic .NET-Programme enthalten doch Module, dieüber den Module-Befehl definiert werden. Die wurden im letzten Abschnittwohl vergessen? Nun, nicht ganz. Visual Basic .NET-Module sind Program-melemente, für die es in der CLR keine direkte Entsprechung gibt. (Jedes.NET-Programm lässt sich zwar in ein Modul kompilieren, das Teil eines As-sembly werden kann, doch handelt es sich bei diesen Modulen um eine ganzandere Geschichte.) Module sind in erster Linie dazu da, Visual Basic-6.0-Pro-grammierern eine vertraute Umgebung zu schaffen. Hinter jedem Modul ver-birgt sich eine Klasse, bei der bestimmte Einstellungen so gesetzt sind, dass siesich wie ein Modul benutzen lässt. Im Folgenden sehen Sie einen direktenVergleich zwischen einem Modul und einer Klasse, die sich genauso verhältwie ein Modul:

Module basTest Public F1 As IntegerEnd Module

Dies ist eine Konstruktion, die allen Programmierern, die bereits mit älterenVisual Basic-Versionen gearbeitet haben, bestens vertraut sein sollte (mit demkleinen Unterschied, dass es dort keinen Module-Befehl gab und ein Moduldurch Hinzufügen eines weiteren »Moduls«, das immer als separate Datei ge-speichert werden musste, definiert wurde). Durch die drei Befehle wird einModul mit dem Namen basTest definiert, das eine (öffentliche) Variable mitdem Namen F1 enthält. Da die Variable öffentlich ist, kann sie im gesamtenProgramm angesprochen werden, ohne dass der Name des Moduls voran-gestellt werden muss.

Page 109: Jetzt lerne ich Visual Basic.NET  GERMAN

109

Der allgemeine Aufbau eines Visual Basic .NET-Programms

Jedes Modul kann bei Visual Basic .NET auch durch eine Klasse dargestelltwerden (eigentlich müsste die Formulierung umgekehrt lauten, da die Klasseder fest eingebaute Typ ist und ein Modul »nachbildet«). Allerdings müssen alleMitglieder der Klasse mit Shared als gemeinsam deklariert werden, damit sieauf die gleiche Weise angesprochen werden können:

Class basTest Public Shared F1 As IntegerEnd Class

Der Zugriff auf die Variable F1 sieht nun wie folgt aus:

basTest.F1

Nun, ganz so identisch sind Klassen und Module wohl doch nicht, denn esmuss immer noch der Klassenname vorangestellt werden (bei einem Modul istder Modulname dagegen optional). Ja und nein. Es gibt noch eine weitereEinstellung, die Visual Basic .NET hinter den Kulissen trifft, wenn ein Modulim Spiel ist. Es ist der Imports-Befehl, durch den der so genannte Namens-raum des Moduls im Programm bekannt gemacht wird, so dass die imNamensraum der Klasse definierten Typen (also die Variable F1) auch ohneVoranstellen des »Namensraumqualifizierers« (also des Klassennamens) akzep-tiert werden. Bezogen auf das obige Beispiel lautet der Befehl wie folgt:

Imports ModulTest.basTest

Bei ModulTest handelt es sich um den Programmnamen, von dem bislangnoch keine Rede war, der aber stets vorangestellt werden muss.

Soll man als Programmierer nun mit Modulen arbeiten oder nicht? Die Ant-wort hängt mit der Frage »Alte oder neue Schule?« zusammen, die an einigenStelle des Buchs gestellt wird. Der Module-Befehl ist eine Konzession an jeneProgrammierer, die bereits ältere Versionen von Visual Basic kennen und sehrirritiert wären, wenn es unter Visual Basic .NET keine Module mehr gebenwürde. (Es würde bedeuten, das Programm komplett auf Klassen umstellen zumüssen, was bei einigen Programmierern eine Art »Kulturschock« auslösenkönnte.) Außerdem ist der Befehl für besonders tippfaule Programmiererganz praktisch, da sie so nicht jede Variable mit Shared deklarieren müssen.Da der Befehl aber streng genommen überflüssig ist und im Rahmen einerEinführung, die nicht nur die Befehle, sondern auch die »Befehlsphilosophie«der Programmiersprache Visual Basic .NET umfasst, den Blick für das We-sentliche (und das sind bei Visual Basic .NET die Klassen und die damit zu-sammenhängenden Konzepte) verstellt, wird der Module-Befehl für die fol-genden Kapitel nicht mehr verwendet. Es ist jedoch jedem freigestellt, diesanders zu handhaben. Es ist weder schlechter Programmierstil noch führt eszu irgendwelchen Nachteilen, Module zu definieren.

Page 110: Jetzt lerne ich Visual Basic.NET  GERMAN

110

Visual Basic .NET-Einmaleins3

3.10 F&A

Frage 3-1:

Wie lassen sich die folgenden Befehle bei Visual Basic .NET vereinfachen?

Dim n As Integer, m As Integerm = 100n = 200

Frage 3-2:

Ist die folgende Deklaration erlaubt?

Dim x, y As Integer = 100

Frage 3-3:

Ein Programmierer möchte ausrechnen, was er an einem Auftrag verdientund hat folgende beiden Befehle bereits eingetippt:

Dim Betrag As DecimalBetrag = 1E6

Doch leider erhält er nach der Eingabe eine Fehlermeldung. Was ist derGrund und wie lässt sie sich abstellen?

Frage 3-4:

Unser Programmierer hat seinen Fehler inzwischen entdeckt und möchte sichnun den in Aussicht gestellten Lohn für seine noch nicht erbrachte Leistunganzeigen lassen. Von einer Webseite hat er den folgenden Befehl abgetippt:

Msgbox ("Du bekommst: " & Betrag.ToString("C"))

Ist dieser Befehl erlaubt und wenn ja, wieso ist diese Konstruktion möglich?

Frage 3-5:

Wie kann der klassische Befehl zum Erhöhen einer Variablen um eins bei Vi-sual Basic .NET etwas eleganter geschrieben werden:

n = n +1?

Frage 3-6:

Ein Programmierer möchte über die die IsNumeric-Funktion der Kompatibi-litätsklasse prüfen, ob eine über Tastatur eingegebene Zeichenfolge eine Zahlist (numerisch) und positiv ist:

Page 111: Jetzt lerne ich Visual Basic.NET  GERMAN

111

F&A

Dim stEingabe = ReadLine()If IsNumeric(stEingabe) = True And CInt(stEingabe) > 0 Then Writeline("Alles klar mit der Zahl")Else Writeline("Also, hier stimmt was nicht")End If

Welcher kleine Denkfehler ist dem Programmierer hier unterlaufen und wielässt sich das Problem durch Austauschen eines Operators beheben?

(Alle Antworten und Lösungen finden Sie in Anhang D.)

Page 112: Jetzt lerne ich Visual Basic.NET  GERMAN
Page 113: Jetzt lerne ich Visual Basic.NET  GERMAN

113

KAPITEL 4

Kontrollstrukturen

Hinter dem recht nüchtern klingenden Begriff Kontrollstrukturen verbergensich jene Befehle einer Programmiersprache, mit deren Hilfe sich der Pro-grammverlauf »kontrollieren« lässt. In diese Kategorie fallen vor allem die Ent-scheidungen und die Programmschleifen, die beide in diesem Kapitel vorge-stellt werden. Auch wenn jede Programmiersprache ihre Besonderheitenbesitzen dürfte, ist das Prinzip der Entscheidungen und der Programmschlei-fen bei praktisch allen Programmiersprachen relativ identisch.

Visual Basic .NET bietet Befehle für Entscheidungen und Programmschleifen,die sich praktisch »seit Generationen« nicht geändert haben. Leser, die bereitsältere Versionen von Visual Basic kennen, werden dieses Kapitel daher inRekordzeit absolvieren können. Alle anderen sollten es dagegen aufmerksamdurcharbeiten, denn die Befehle, die in diesem Kapitel vorgestellt werden, bil-den den »Kern« der Programmiersprache, der in praktisch jedem Programmzum Einsatz kommt.

Die Themen für dieses Kapitel:

� Wenn etwas so ist, dann tue mit dem If-Befehl

� Es gibt immer eine Alternative – der Else-Befehl

� Der ElseIf-Befehl als Abkürzung

� Mehrfachentscheidungen mit dem Select Case-Befehl

� Wiederholungen mit System – der For Next-Befehl

Page 114: Jetzt lerne ich Visual Basic.NET  GERMAN

114

Kontrollstrukturen4� Wiederholungen mit Abbruchbedingung – der Do Loop-Befehl

� Die Alternative, die eigentlich keine ist – der While-Befehl

� Schleifen mit Notausgang – der Exit-Befehl

4.1 Das Prinzip der Entscheidungen

In den Vorstellungen einiger Menschen sind Computer nach wie vor über-mächtige »Elektronengehirne«, die Wahlergebnisse und Aktienkurse voraus-sagen können, stets die richtige Entscheidungen treffen und bereits im Vorauswissen, wer den nächsten Grand Prix de la Chanson gewinnt. Verstärkt wer-den solche Vorstellungen natürlich durch das Fernsehen und das Kino, bei de-nen Menschen wie selbstverständlich mit Computer und Robotern reden, die-se stets intelligente Antworten geben und am Ende nur mit viel Mühe davonabgehalten werden können, effektvoll den ganzen Planeten zu zerstören oderdem letzten Astronauten an Bord den Sauerstoff abzustellen. Das ist natürlichalles Humbug. Computer können weder denken noch selbstständige Ent-scheidungen treffen (zumindest jene, mit denen wir Normalsterbliche unsbeschäftigen – über andere Computer ist allerdings nichts bekannt). DassComputer dennoch so viele Aufgaben übernehmen, bei denen scheinbarIntelligenz erforderlich ist, hat einen erstaunlich simplen Hintergrund. Com-puter können lediglich zwei (beliebige) Ausdrücke vergleichen, wobei dasErgebnis immer (die Betonung liegt auf immer) Falsch oder Wahr ist. DieBegriffe »Falsch« oder »Wahr« dürfen in diesem Fall aber nicht umgangsprach-lich interpretiert werden. Sie stehen vielmehr für die Zustände »Trifft nicht zu«(Falsch) und »Trifft zu« (Wahr). Das Besondere daran ist, dass Computer sol-che supersimplen Entscheidungen unglaublich schnell durchführen können.Selbst ein preiswerter PC aus dem Kaufhaus schafft locker mehrere MillionenEntscheidungen pro Sekunde (die Anzahl der Entscheidungen pro Sekundewird dabei direkt durch die Taktfrequenz des Prozessors bestimmt). Kein Wun-der also, dass Computer intelligent wirken, es in Wirklichkeit aber nicht sind.

Das Prinzip, nach dem ein Computer Entscheidungen trifft, stellt auch dieGrundlage einer jeden Programmiersprache dar. Letztendlich basiert die »In-telligenz« eines Computers nicht auf seiner Hardware, sondern seiner Soft-ware. Jede Programmiersprache, deren Aufgabe es ja ist, Software zu erstel-len, enthält daher Befehle, mit deren Hilfe sich Entscheidungen in einemProgramm durchführen lassen. Auch wenn diese Befehle von Programmier-sprache zu Programmiersprache anders lauten können, sie basieren stets aufVergleichen, deren Ergebnis nur zwei Zustände kennt: wahr oder falsch.

Page 115: Jetzt lerne ich Visual Basic.NET  GERMAN

115

Wenn etwas so ist, dann tue das – der If-Befehl

4.2 Wenn etwas so ist, dann tue das – der If-Befehl

Im letzten Abschnitt wurde das allgemeine Prinzip von Entscheidungen vor-gestellt. Der Befehl, mit dem dieses Prinzip bei Visual Basic .NET umgesetztwird, ist der If-Befehl, der in den meisten Fällen mit einem End If-Befehl ab-geschlossen wird. Der If-Befehl ist ein Befehl, der alle folgenden Befehle nurdann ausgeführt, wenn eine Bedingung erfüllt ist. Die Bedingung besteht auseinem Ausdruck, der stets nur wahr oder falsch sein kann. Die Bedingung isterfüllt, wenn der Ausdruck wahr ist. Ansonsten ist sie nicht erfüllt. Einen drit-ten Weg in der Mitte gibt es nicht.

3Es soll geprüft werden, ob eine eingegebene Altersangabe 0 oder negativ ist.In diesem Fall soll eine Meldung ausgegeben werden.

Alter = ReadLine()If (Alter <= 0) Then WriteLine("Das Alter darf nicht kleiner oder gleich 0 sein!")

Sie wissen bereits, dass der If-Befehl stets einen Ausdruck prüft, der unmittel-bar auf den Befehl folgt (die Klammern sehen zwar gut aus, sind aber nichtzwingend notwendig). Sie wissen auch, dass der Ausdruck nur Wahr (True)oder Falsch (False) ergeben kann. Nun, dann ist alles Weitere klar. Der Aus-druck lautet:

Alter <= 0

und wird gelesen wie »Alter kleiner oder gleich 0«. Ist dies der Fall, d.h., besitztdie Variable Alter tatsächlich einen Wert, der kleiner oder gleich 0 ist, dannund nur dann ist der gesamte Ausdruck Wahr und der auf den Then-Befehlfolgende Befehl wird ausgeführt.

Alles klar? Wenn ja, dann erfahren Sie jetzt, dass die obige Variante alles an-dere als optimal ist1. Und zwar aus drei Gründen:

� Was ist, wenn die Variable einen Wert besitzt, der größer als 0 ist?

� Was ist, wenn auf den If-Befehl mehrere Befehle folgen sollen?

� Was ist, wenn für die Variable Alter keine Zahl eingeben wurde?

Die erste Frage lässt sich leicht beantworten, denn in diesem Fall wird einfachder nachfolgende Befehl ausgeführt und der folgende WriteLine-Aufruf über-gangen. Die Antwort auf die zweite Frage setzt bereits Visual Basic-Kenntnis-se voraus. In diesem Fall werden alle folgenden Befehle nacheinander aufge-führt und durch einen End If-Befehl abgeschlossen (ein Beispiel folgt gleich).

1. Wenn nicht, dann sollten Sie den letzten Abschnitt so oft lesen, bis auch bei Ihnen (genauerbei Ihrem Gehirn) die Bedingung »Alles klar?« einen True-Wert zurückgibt.

Page 116: Jetzt lerne ich Visual Basic.NET  GERMAN

116

Kontrollstrukturen4Die Antwort auf die dritte Frage muss bis zum Kapitel 9 warten, in dem es umdie Ausnahmen und ihre Behandlung geht. (Ein solcher Fall lässt sich nämlichbei Visual Basic .NET nicht direkt abfragen, sondern nur indirekt über eineAusnahme feststellen.)

3Hier zunächst jene Variante, bei der auf den If-Befehl gleich mehrere Befehlefolgen.

Listing 4-1:Ein Beispiel

für den If Else-Befehl

' -----------------------------------------------' Beispiel für den If Else-Befehl' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.Console

Class App

Shared Sub Main() Dim Alter As Short Write("Bitte ein Alter eingeben: ") Alter = ReadLine() If (Alter <= 0) Then WriteLine("Das Alter darf nicht kleiner oder gleich 0 sein!") WriteLine("Denken Sie doch einmal g’scheit nach") Alter = 0 End If End Sub

End Class

Starten Sie das Programm und geben Sie eine Zahl ein. Ist sie größer 0, pas-siert nichts, da in diesem Fall die Bedingung nicht erfüllt ist und die Program-mausführung mit dem ersten Befehl nach dem End If-Befehl fortgesetzt wird.Ist die Eingabe dagegen kleiner 0, ist die Bedingung erfüllt und es werden eineReihe von »Belehrungen« ausgegeben. Natürlich müssen auf einen If-Befehlnicht nur WriteLine-Aufrufe folgen, es dürfen vielmehr beliebige Befehle fol-gen (auch, was die Anzahl der Befehle angeht, gibt es keine Einschränkung –allzu viele sollten es aber nicht sein, da es ansonsten zu unübersichtlich wer-den dürfte).

Ein wichtiger Punkt muss an dieser Stelle bereits angesprochen werden, da erfür alle Programme gilt, bei denen eine Eingabe durch den Benutzer erfolgt.In der Praxis muss auf jede Eingabe eine Eingabeüberprüfung folgen, durchdie sichergestellt wird, dass der richtige Datentyp eingegeben wurde. Dies ge-schieht nicht nur, weil das Programm ansonsten falsch rechnen könnte, son-

Buch-CD: vbnet0401.vb

Page 117: Jetzt lerne ich Visual Basic.NET  GERMAN

117

Wenn etwas so ist, dann tue das – der If-Befehl

dern vor allem dann, wenn die CLR bei einer falschen Typenzuordnung eineAusnahme verursacht, die abgefangen werden muss (mehr zu diesen Ausnah-men in Kapitel 9). Geben Sie etwa bei dem letzten Beispiel statt einer Zahl ei-nen Buchstaben ein (das kann niemand verhindern), führt dies dazu, dass derBefehl

Alter = ReadLine()

versucht, einer Variablen vom Typ Short eine Zeichenkette zuzuweisen, diekeine Zahl darstellt. Da dies nicht funktionieren kann, ist eine Ausnahme dieFolge, die normalerweise (wenn sie nicht abgefangen wird) zu einem Pro-grammabbruch führt. Denken Sie bitte bei allen Beispielen in diesem Buch,bei denen Eingaben im Spiel sind, daran, dass eine Eingabeüberprüfung meis-tens nicht mit dabei ist, um das Beispiel nicht unnötig kompliziert zu machen(nicht, dass dies kompliziert wäre, nur sollen die Beispiele sich stets auf einenThemenbereich beschränken).

4.2.1 Vergleichsoperatoren

Speziell für die Durchführung von Vergleichen stellt Visual Basic .NET (wiejede Programmiersprache) einen Satz von Operatoren bereit. Möchten Sieetwa prüfen, ob zwei Ausdrücke gleich sind, verwenden Sie den Gleichheits-operator, der aus einem Gleichheitszeichen besteht. Da Operatoren bereits inKapitel 3.5 vorgestellt wurden, stellt Tabelle 4.1 lediglich die vorhandenenVergleichsoperatoren zusammen.

Tabelle 4.1:Die Vergleichs-operatoren von Visual Basic .NET

4.2.2 Bedingungen kombinieren

Häufig hängt eine Entscheidung nicht von einer, sondern von mehreren Be-dingungen ab. Ein Bankautomat (das klassische Beispiel) spuckt nur dann diegewünschten Euros aus, wenn mindestens drei Bedingungen erfüllt sind:

� Es muss sich um eine gültige Karte handeln.

� Die Geheimzahl stimmt.

� Das Konto weist ein ausreichendes Guthaben auf.

Operator Bedeutung

< Kleiner

<= kleiner gleich

> Größer

>= Größer gleich

= Gleich

<> Ungleich

Page 118: Jetzt lerne ich Visual Basic.NET  GERMAN

118

Kontrollstrukturen4Die Programmierer, die für die Software des Bankautomaten zuständig sind(auch wenn es nicht sehr wahrscheinlich ist, spräche nichts dagegen, dass hierVisual Basic zum Einsatz kommt), müssen daher eine Möglichkeit haben, die-se drei Bedingungen zu kombinieren. Diese Möglichkeit bieten bei VisualBasic die logischen Operatoren And und Or bzw. ihre Verwandten AndAlsound OrAlso (mehr dazu in Kapitel 3.5). Müssen bei einer Mehrfachverknüp-fung alle Teilbedingungen erfüllt sein, damit die gesamte Bedingung erfüllt ist,kommt der And-Operator zum Einsatz.

3Der folgende If-Befehl prüft die drei Bedingungen, die erfüllt sein müssen, da-mit es zu einer Geldauszahlung kommt.

If KarteOk = True And GeheimzahlOk = True And Guthaben > Betrag Then GeldAuszahlen

Genauso häufig genügt es aber auch, wenn eine von mehreren Bedingungenerfüllt ist, damit die Gesamtbedingung erfüllt ist. Das (klassische) Beispiel istdie Alarmanlage, die immer dann einen Alarm auslöst, wenn entwederSensor1 oder Sensor2 oder Sensor3 usw. einen Kontakt gibt. Für diese Formder Verknüpfung gibt es den Or-Operator.

3If Sensor1 = True Or Sensor2 = True Or Sensor3 = True Then

4.3 Es gibt immer eine Alternative – der Else-Befehl

Soll für den Fall, dass eine Bedingung nicht zutrifft, ein alternativer Befehls-block ausgeführt werden, kommt der Else-Befehl zum Einsatz.

3In dem folgenden Beispiel prüft der If-Befehl die Variable Alter. Ist ihr Wertgrößer 0, sorgt der Else-Befehl dafür, dass eine entsprechende Meldung aus-gegeben wird.

Listing 4-2:Beispiel für

den Else-Befehl

' -----------------------------------------------' Beispiel für den Else-Befehl' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.Console

Class App

Shared Sub Main()

Buch-CD: vbnet0402.vb

Page 119: Jetzt lerne ich Visual Basic.NET  GERMAN

119

Der ElseIf-Befehl als Abkürzung

Dim Alter As Integer Write("Bitte ein Alter eingeben: ") Alter = ReadLine() If (Alter <= 0) Then WriteLine("Das Alter darf nicht kleiner oder gleich 0 sein!") Else WriteLine("Das war ganz prima, braver Anwender!") End If End Sub

End Class

Alle Befehle nach dem Else-Befehl werden nur ausgeführt, wenn die Bedin-gung, die auf den If-Befehl folgt, nicht erfüllt ist.

4.4 Der ElseIf-Befehl als Abkürzung

Sobald mehrere Entscheidungen verschachtelt werden müssen, wird der Else-Befehl etwas unhandlich, da zu jedem Else-Befehl ein separater End If-Befehlaufgeführt werden muss.

3Das folgende Beispiel demonstriert, dass am Ende einer solchen Konstruktionstets eine Aneinanderreihung von (im Grunde überflüssigen) End If-Befehlensteht. Es nimmt über die Tastatur (ReadLine-Methode) ein Geburtsdatum ent-gegen und gibt das zugehörige Sternzeichen aus (aus Platzgründen werdennur einige Sternzeichen abgefragt). Bitte achten Sie darauf, dass eine Einga-be, die vom Programm nicht als Datum interpretiert werden kann, eine Aus-nahme zur Folge hat. Das liegt daran, dass keine Abfrage eingebaut wurde(mehr zur Behandlung von Ausnahmen in Kapitel 9).

Listing 4-3:Ein Beispiel für einen ver-schachtelten If-Befehl

' -----------------------------------------------' Beispiel für einen verschachtelten If-Befehl' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.Console

Class App

Shared Sub Main() Dim GebDatum As Date Dim Sternzeichen As String Write("Bitte Geburtstag 2002 eingeben (TT/MM/02): ") GebDatum = ReadLine()

Buch-CD: vbnet0403.vb

Page 120: Jetzt lerne ich Visual Basic.NET  GERMAN

120

Kontrollstrukturen4 If GebDatum >= "23.10.02" And GebDatum <= "21.11.02" Then Sternzeichen = "Skorpion" Else If GebDatum >= "22.11.02" And GebDatum <= "21.12.02" Then Sternzeichen = "Schütze" Else If GebDatum >= "21.12.02" And GebDatum <= "19.01.03" Then Sternzeichen = "Steinbock" Else If GebDatum >= "20.01.2002" And GebDatum <= "17.02.2002" Then Sternzeichen = "Wassermann" Else Sternzeichen = "Scherzkeks" End If End If End If End If WriteLine("Sie sind ein(e) {0}", Sternzeichen) End SubEnd Class

Das sieht nicht nur ein wenig »uncool« aus, es bedeutet auch unnötige Tipp-arbeit und macht das Programm unübersichtlich. Das muss nicht sein, denngenau für diesen Zweck gibt es den ElseIf-Befehl, der immer dann zum Ein-satz kommt, wenn auf den Else-Befehl gleich wieder ein If-Befehl folgt, umfür den Fall, dass die erste Bedingung nicht erfüllt ist, eine weitere Bedingungzu testen. Der Vorteil dieses Befehls ist, dass der EndIf-Befehl für den Else-Zweig entfällt.

3Das folgende Beispiel entspricht dem Beispiel aus dem letzten Abschnitt, nurdass es dank des ElseIf-Befehls etwas übersichtlicher geworden ist.

Listing 4-4:Ein Beispiel

für den ElseIf-Befehl

' -----------------------------------------------' Beispiel für den ElseIf-Befehl' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.Console

Class App

Shared Sub Main() Dim GebDatum As Date Dim Sternzeichen As String Write("Bitte Geburtstag 2002 eingeben (TT/MM/02): ")

Buch-CD: vbnet0404.vb

Page 121: Jetzt lerne ich Visual Basic.NET  GERMAN

121

Mehrfachentscheidungen mit dem Select Case-Befehl

GebDatum = ReadLine() GebDatum = CType(GebDatum, Date) If GebDatum >= "23.10.02" And GebDatum <= "21.11.02" Then Sternzeichen = "Skorpion" ElseIf GebDatum >= "22.11.02" And GebDatum <= "21.12.02" Then Sternzeichen = "Schütze" ElseIf GebDatum >= "21.11.02" And GebDatum <= "19.01.03" Then Sternzeichen = "Steinbock" ElseIf GebDatum >= "20.01.02" And GebDatum <= "17.02.02" Then Sternzeichen = "Wassermann" Else Sternzeichen = "Scherzkeks" End If WriteLine("Sie sind ein(e) {0}", Sternzeichen) End SubEnd Class

4.5 Mehrfachentscheidungen mit dem Select Case-Befehl

Geht es darum, einen festen Ausdruck gegen mehrere Alternativen zu verglei-chen, ist der Select Case-Befehl oft sehr viel praktischer als eine Aneinander-reihung von If- und ElseIf-Befehlen. Der Select Case-Befehl prüft keine Be-dingung, sondern vergleicht einen Ausdruck, der eine beliebige Anzahl anWerten annehmen kann. Für jeden Wert, der verglichen werden soll, wird einCase-Befehl aufgeführt, auf den alle Befehle folgen, die ausgeführt werdensollen, wenn der zu prüfende Ausdruck genau diesen Wert besitzt. Der SelectCase-Befehl besitzt die folgende allgemeine Struktur:

Select Case <Prüfausdruck> Case <Vergleichswert1> ' BefehleCase <Vergleichswert2> ' BefehleCase <Vergleichswert3> ' Befehle ' usw.Case Else ' BefehleEnd Select

Es ist wichtig zu verstehen, dass nur die Befehle des Case-Zweigs ausgeführtwerden, der den gleichen Wert wie der Ausdruck besitzt. Alle übrigen Befehlewerden ignoriert. Der Case Else-Zweig ist für den Fall gedacht, dass keinerder Werte passt.

Page 122: Jetzt lerne ich Visual Basic.NET  GERMAN

122

Kontrollstrukturen4

3Das folgende Beispiel prüft den Wert der Variablen Note.

Listing 4-5:Ein einfaches

Beispiel fürden Select

Case-Befehl

' -----------------------------------------------' Beispiel Nr. 1 für den Select Case-Befehl' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.Console

Class App Shared Sub Main() Dim Note As Byte Dim Bewertung As String Note = 1 ' Kann im Bereich 1 bis 3 liegen Select Case Note Case 1 Bewertung = "Das ist spitze!" Case 2 Bewertung = "Gar nicht übel" Case 3, 4, 5 Bewertung = "Na ja, geht so..." Case Else Bewertung = "Außerhalb des Bereichs" End Select WriteLine("Die Bewertung ist: {0}", Bewertung) End SubEnd Class

Der dritte Case-Zweig zeigt, dass sich auch mehrere Vergleichswerte auffüh-ren lassen, die der Reihe nach geprüft werden. Die folgenden Befehle werdenausgeführt, wenn einer der Werte übereinstimmt. Der Case-Befehl ist kein If-Befehl, der eine Bedingung prüft, die True oder False sein kann. Der Case-Befehl prüft vielmehr, ob der Vergleichsausdruck mit dem Prüfausdruck über-einstimmt. Der folgende Case-Befehl führt daher zu einem falschen Resultat:

Note = 4Select Case Note Case Note = 4 Bewertung = "Das ist eine glatte Vier"

Warum prüft dieser Befehl nicht den Fall, dass die Variable Note gleich 4 ist?Weil der Case-Befehl nicht prüft, ob der folgende Ausdruck wahr ist, sonderndiesen Ausdruck mit dem Prüfausdruck vergleicht. Angenommen, der Prüf-ausdruck ist 4. Dann ergibt der Ausdruck Note = 4 zwar True, doch True ist

Buch-CD: vbnet0405.vb

Page 123: Jetzt lerne ich Visual Basic.NET  GERMAN

123

Mehrfachentscheidungen mit dem Select Case-Befehl

nicht gleich 4. Die auf den Case-Befehl folgenden Befehle werden dahernicht ausgeführt.

Ein Vergleichsausdruck muss natürlich nicht aus Zahlen bestehen, erlaubt sindalle elementaren Datentypen.

3Das folgende Beispiel nimmt den Namen einer Programmiersprache von derTastatur entgegen und vergleicht die Eingabe über einen Select Case-Befehl.

Listing 4-6:Ein weiteres Beispiel für den Select Case-Befehl

' -----------------------------------------------' Beispiel Nr. 2 für den Select Case-Befehl' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------Option Compare Text

Imports System.Console

Class App Shared Sub Main() Dim Sprache, Bewertung As String Write("Wählen Sie Ihre Sprache: ") Sprache = ReadLine() Select Case Sprache Case "Java", "C++" Bewertung = "Gute Wahl" Case "Cobol", "RPG" Bewertung = "Bitte dringend umschulen" Case "Visual Basic", "C#" Bewertung = "Damit kann nichts schiefgehen" Case Else Bewertung = "Diese Sprache kenne ich nicht" End Select WriteLine("Die Bewertung ist: {0}", Bewertung) End Sub

End Class

Ist Ihnen aufgefallen, dass die Groß-/Kleinschreibung bei der Eingabe einesNamens keine Rolle spielt? (Sie können wahlweise Java oder java eingeben.)Das liegt daran, dass zu Beginn der Befehl

Option Compare Text

ausgeführt wurde. Dieser Befehl sorgt dafür, dass Zeichenfolgen als Textele-mente und nicht als binäre Datenelemente verglichen werden. Das Gegenteilist der Befehl Option Compare Binary, der nicht eingegeben werden muss,

Buch-CD: vbnet0406.vb

Page 124: Jetzt lerne ich Visual Basic.NET  GERMAN

124

Kontrollstrukturen4da es die Standardeinstellung ist. Wie alle Option-Befehle muss auch dieserBefehl der erste Befehl eines Programms sein.

3Das folgende Beispiel führt erneut einen Vergleich eines eingegebenenDatums aus, um das Sternzeichen zu ermitteln.

Listing 4-7:Datums-

abfrage mitSelect Case-

Befehl

' -----------------------------------------------' Beispiel Nr. 3 für den Select Case-Befehl' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.Console

Class App Shared Sub Main() Dim GebDatum As Date Dim Sternzeichen As String Write("Bitte Geburtstag 2002 eingeben (TT/MM/02): ") GebDatum = ReadLine() Select Case GebDatum Case "23.09.02" To "22.10.02" Sternzeichen = "Waage" Case "23.10.02" To "21.11.02" Sternzeichen = "Skorpion" Case "22.11.02" To "21.12.02" Sternzeichen = "Schütze" Case "21.12.02" To "19.01.03" Sternzeichen = "Steinbock" Case "20.01.02" To "17.02.02" Sternzeichen = "Wassermann" Case Else Sternzeichen = "Scherzkeks" End Select WriteLine("Sie sind ein(e) {0}", Sternzeichen) End SubEnd Class

Achten Sie bitte darauf, auf welche Weise der Datumsbereich verglichen wird.Um zu prüfen, ob die Variable GetDatum in einem bestimmten Bereich liegt,kommt das Schlüsselwort To des Select Case-Befehls zum Einsatz. BeachtenSie außerdem, dass die Variable GetDatum vom Typ Date sein muss, damitein solcher Vergleich möglich ist. Ansonsten ist das Datum lediglich eine Zei-chenkette, für die andere Regeln gelten. Der 21.1 liegt dann nämlich hinterdem 19.2, da ein einfacher Vergleich der Zeichen durchgeführt wird.

Buch-CD: vbnet0407.vb

Page 125: Jetzt lerne ich Visual Basic.NET  GERMAN

125

Wiederholungen mit System – der For Next-Befehl

4.5.1 Einen Case-Zweig vorzeitig verlassen

Der Case-Zweig kann über den Befehl Exit Select vorzeitig verlassen werden.

4.6 Wiederholungen mit System – der For Next-Befehl

Wiederholungen sind das Lebenselixier eines Programms. Oder etwas sachli-cher formuliert, erst durch die Verwendung von Wiederholungen entfaltet einComputerprogramm seine Leistungsfähigkeit, denn wenn der Computer ei-nes gut kann, dann ist es, einen Befehl oder eine Gruppe von Befehlen einebeliebige Anzahl oft extrem schnell zu wiederholen. Eine solche Wieder-holung wird Schleife oder Programmschleife genannt, der Befehl, der einesolche Wiederholung durchführt, heißt entsprechend Schleifenbefehl. VisualBasic .NET bietet (wie seine Vorgänger) nicht einen, sondern gleich dreiSchleifenbefehle:

� Der For Next-Befehl

� Der Do Loop-Befehl

� Der While End While-Befehl

Streng genommen sind es sogar vier, doch der vierte im Bunde, der For Each-Befehl, wird nur in Zusammenhang mit Auflistungen und Arrays verwendetund daher in Kapitel 10 vorgestellt.

4.6.1 Zählschleifen mit For Next

Die Aufgabe des For Next-Befehls ist es, eine Gruppe von Befehlen so langezu wiederholen, wie eine Variable, die bei jedem Durchlauf um einen be-stimmten Betrag erhöht (oder erniedrigt) wird, einen Endwert erreicht hat.

3Das folgende Beispiel zeigt eine kleine Schleife, die insgesamt zehnmal wie-derholt wird. Dabei wird die Variable j bei jedem Durchlauf um eins erhöht.

Listing 4-8:Ein Beispiel für den For Next-Befehl

' -----------------------------------------------' Beispiel Nr. 1 für den For Next-Befehl' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.Console

Buch-CD: vbnet0408.vb

Page 126: Jetzt lerne ich Visual Basic.NET  GERMAN

126

Kontrollstrukturen4Class App

Shared Sub Main() Dim j As Short For j = 1 To 10 WriteLine("Dies ist Durchlauf Nr. {0}", j) Next ReadLine() End SubEnd Class

Die Schleifenvariable spielt in diesem Fall die Variable j, wobei es sich hier umeine beliebige Variable handeln kann. Außerdem muss der Startwert nicht 1,der Endwert nicht 10 und der Betrag, um den die Schleifenvariable bei jedemDurchlauf erhöht wird, nicht 1 betragen. Hier sind beliebige Werte erlaubt.

Listing 4-9:Eine For Next-

Schleife mit»Genauigkeits-

problemen«

' -----------------------------------------------' Beispiel Nr. 2 für den For Next-Befehl' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.Console

Class App

Shared Sub Main() Dim j As Single For j = -5 To 5 Step .1 WriteLine("Der Wert von j ist {0}", j) Next ReadLine() End SubEnd Class

Über das Schlüsselwort Step wird erreicht, dass die Variable j bei jedemDurchlauf nicht um 1, sondern um 0.1 erhöht wird (dadurch treten eine Reihe»krummer« Werte, insbesondere in der Nähe von 0, auf, was auf eine durchdas interne Darstellungsformat von Fließkommazahlen bedingte Ungenauig-keit zurückzuführen ist – mehr dazu in Kapitel 10).

Natürlich ist eine Programmschleife zum Zählen viel zu schade. Es lassen sichselbstverständlich beliebige Befehle innerhalb einer Programmschleife ausfüh-ren. Sie gehört schließlich zum Grundrepertoire einer jeden Programmier-sprache.

Buch-CD: vbnet0409.vb

Page 127: Jetzt lerne ich Visual Basic.NET  GERMAN

127

Wiederholungen mit System – der For Next-Befehl

Abb. 4.1:Insbesondere in der Nähe von 0 treten beim Schleifen-durchlauf klei-ne Ungenauig-keiten auf

3Das folgende Beispiel führt eine einfache Zinsrechnung durch. Nach Eingabevon Kapital, Zinssatz und Laufzeit wird für jedes Jahr der um den Zins ge-wachsene Betrag angezeigt. Für die typische Währungsformatierung wird dieToString-Methode mit dem »c« als Formatname benutzt (dies ist eine vonmehreren Möglichkeiten), doch anscheinend lässt sich das Eurozeichen nichtin der Eingabeaufforderung anzeigen.

Listing 4-10:Zinsberech-nung in der Schleife

' -----------------------------------------------' Beispiel Nr. 3 für den For Next-Befehl' Éinfache Zinsberechnung' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.Console

Class App

Shared Sub Main() Dim Kapital, Zinssatz As Single Dim Laufzeit, j As Short Write("Kapital: ") Kapital = ReadLine() Write("Zinssatz: ") Zinssatz = ReadLine() Write("Laufzeit: ") Laufzeit = ReadLine()

Buch-CD: vbnet0410.vb

Page 128: Jetzt lerne ich Visual Basic.NET  GERMAN

128

Kontrollstrukturen4 For j = 1 To Laufzeit Kapital += Kapital / 100 * Zinssatz WriteLine("Nach {0} Jahre gibt es {1}", j, Kapital.ToString("c")) Next ReadLine() End Sub

End Class

Abb. 4.2:Ist das Spar-

buch noch zeit-gemäß? – die

For Next-Schleife gibteine Orien-

tierungshilfe

For Next-Schleifen mit negativer Schrittweite

Die Schleifenvariable einer For Next-Schleife kann bei jedem Durchlauf umeinen beliebigen Wert erhöht werden. Dadurch ist auch ein Herunterzähleneiner Variablen möglich, denn dazu muss die Schrittweite lediglich negativsein.

3Das folgende Beispiel zählt die Schleifenvariable j von 10 auf 1 herunter.

Dim j As ShortFor j = 10 To 1 Step –1 Writeline ("Rocket-Launch bei t-{1}", j)Next j

1 Bei einer negativen Schrittweite darf die Schleifenvariable nicht vom TypByte sein, auch wenn die Schleifenvariable selber nicht negativ wird.

Page 129: Jetzt lerne ich Visual Basic.NET  GERMAN

129

Wiederholungen mit System – der For Next-Befehl

4.6.2 Wiederholungen mit Abbruchbedingung – der Do Loop-Befehl

Der Do Loop-Befehl kommt immer dann zur Anwendung, wenn die Anzahlder Durchläufe am Anfang noch gar nicht feststeht, sondern vielmehr von ei-ner Bedingung abhängt, die sich bei jedem Durchlauf ändern kann (aber nichtändern muss) und daher auch bei jedem Durchlauf erneut geprüft werdenmuss. Das Prüfen dieser Bedingung kann wahlweise vor einem neuen Durch-lauf, nach erfolgtem Durchlauf oder mittendrin geschehen.

Listing 4-11:Ein Beispiel für eine Do Loop-Schleife

' -----------------------------------------------' Beispiel Nr. 1 für den Do Loop-Befehl' Zinsberechnung mit Zielbetrag' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.Console

Class App

Shared Sub Main() Dim Startbetrag, Zielbetrag, Zinssatz As Single Dim Jahre As Short Write("Startbetrag: ") Startbetrag = ReadLine() Write("Zielbetrag: ") Zielbetrag = ReadLine() Write("Zinssatz: ") Zinssatz = ReadLine() Do Startbetrag *= 1 + Zinssatz / 100 Writeline(Startbetrag) Jahre += 1 Loop Until (Startbetrag >= Zielbetrag) WriteLine("Nach {0} Jahren sind {1} erreicht.", Jahre, Startbetrag.ToString("c")) ReadLine() End Sub

End Class

Dieser Do Loop-Befehl wiederholt die Befehle zwischen Do und Loop so oftbis die Abbruchbedingung Startbetrag >= Zielbetrag erfüllt ist und der Aus-druck Wahr wird. Da es keine automatische Schleifenvariable gibt, muss die-sen Job eine Variable übernehmen, die bei jedem Durchlauf inkrementiertwird. Das Schlüsselwort Until bestimmt, dass die Programmschleife so lange

Buch-CD: vbnet0411.vb

Page 130: Jetzt lerne ich Visual Basic.NET  GERMAN

130

Kontrollstrukturen4wiederholt wird, bis die Abbruchbedingung erfüllt ist. Visual Basic .NET kenntmit dem Schlüsselwort While eine zweite Variante: Hier wird die Programm-schleife so lange wiederholt, bis die Abbruchbedingung erfüllt ist:

Do Startbetrag *= 1 + Zinssatz / 100 Writeline(Startbetrag) Jahre += 1Loop While (Startbetrag < Zielbetrag)

Frage: Wird das While-Schlüsselwort wirklich benötigt? Denken Sie bitte ei-nen Augenblick nach, bevor Sie weiterlesen.

*** Denkpause ***

Die Antwort lautet: Nein, es wird nicht benötigt, denn möchte man erreichen,dass eine Programmschleife so lange wiederholt wird, wie eine Bedingung er-füllt ist, muss man lediglich bei Until die Bedingung umkehren. Aus der Ab-bruchbedingung Betrag <= 10 wird folglich wieder Betrag > 10. Das While-Schlüsselwort ist daher überflüssig1.

4.6.3 Eine Alternative, die eigentlich keine ist – der While-Befehl

Die Zwischenüberschrift ist natürlich erklärungsbedürftig. Aus irgendwelchenGründen erlaubt sich Visual Basic den Luxus eines Befehls, der streng genom-men gar nicht benötigt wird. Es ist der While-Befehl, der eine Schleife einlei-tet, die durch einen End While-Befehl abgeschlossen wird. Der Befehl ist des-wegen überflüssig, da er stets durch ein Do Loop-Befehlspaar ersetzt werdenkann. Für den While-Befehl spricht, dass es ihn a) schon immer gab und dasser b) eine Schleife etwas (die Betonung liegt dabei wirklich auf etwas) kürzermacht, da ein Befehlswort weniger eingegeben werden muss.

3Betrag = 5While Betrag < 10 Betrag = Betrag * 1.07 WriteLine("Der aktuelle Betrag lautet: {0}", Betrag)End While

Dass es eines separaten While-Befehls nicht unbedingt bedurft hätte, zeigtdas nächste kleine Beispiel, dass stattdessen wieder den Do Loop-Befehl ver-wendet, nur dass dieses Mal die Abbruchbedingung bereits am Anfang derSchleife geprüft wird und die Schleife unter Umständen (allerdings nicht indiesem Beispiel) gar nicht durchlaufen wird:

1. Ein weiteres kleines, allerdings auch harmloses, Beispiel für den »Ballast«, den Visual Basic.NET aus früheren Tagen noch mit sich herumträgt.

Page 131: Jetzt lerne ich Visual Basic.NET  GERMAN

131

Schleifen mit Notausgang – der Exit-Befehl

Betrag = 5Do While Betrag < 10 Betrag = Betrag * 1.07 WriteLine("Der aktuelle Betrag lautet: {0}", Betrag)Loop

4.7 Schleifen mit Notausgang – der Exit-Befehl

Jede Programmschleife kann vorzeitig verlassen werden – dafür gibt es denExit-Befehl. Seine Wirkung besteht darin, die Programmschleife zu beendenund den ersten Befehl unmittelbar nach dem Ende der Schleife auszuführen.Da es verschiedene Programmschleifentypen gibt, existiert der Exit-Befehlauch in verschiedenen Varianten:

� Exit For

� Exit Do

� Exit While

Außerdem ist der Exit-Befehl für das Verlassen von Prozeduren, Funktionenund Eigenschaftsprozeduren zuständig, so dass weitere Varianten existieren,die in diesem Zusammenhang aber nicht gesondert hervorgehoben werden(das ist alles in der Hilfe sehr ausführlich beschrieben).

Die Anwendung des Exit-Befehls ist sehr einfach, wobei dieser praktisch aus-schließlich in Zusammenspiel mit einem If-Befehl verwendet wird, damit dieSchleife nur dann verlassen wird, wenn eine bestimmte Bedingung erfüllt ist.

3Die folgende Schleife produziert Zufallszahlen am laufenden Band. Allerdingshat der Programmierer eine Abbruchbedingung vergessen – es handelt sichdaher um eine Endlosschleife, die tatsächlich »niemals« beendet wird1.

Listing 4-12:Ein Beispiel für eine Endlos-schleife

' -----------------------------------------------' Beispiel für den Do Loop-Befehl mit Exit' Zufallszahlen' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.Console

1. Glauben Sie es nicht? Dann probieren Sie es einfach aus.

Buch-CD: vbnet0412.vb

Page 132: Jetzt lerne ich Visual Basic.NET  GERMAN

132

Kontrollstrukturen4Class App

Shared Sub Main() Dim r As System.Random = New System.Random() Do Write(" {0} ", r.Next(1, 49)) Loop ReadLine() End SubEnd Class

Da eine Endlosschleife auf die Dauer etwas eintönig ist (sie kann allerdings beieiner Konsolenanwendung, die in der Visual Studio-IDE läuft, über die Tas-tenkombination Ÿ+C unterbrochen werden, indem das Programm abge-brochen wird), muss mit dem Exit Do-Befehl ein Ausstieg eingebaut werden.

3Die folgende Schleife produziert ebenfalls Zufallzahlen, nur wird die Schleifeabgebrochen, sobald eine ungerade Zahl »gezogen« wurde:

Listing 4-13:Ein Beispiel füreine Do Loop-

Schleife mitExit

' -----------------------------------------------' Beispiel für den Do Loop-Befehl mit Exit' Zufallszahlen' Jetzt lerne ich Visual Basic .NET' -----------------------------------------------

Imports System.Console

Class App

Shared Sub Main() Dim r As System.Random = New System.Random() Dim z As Byte WriteLine("Und nun die geraden Lottozahlen...") Do z = r.Next(1, 49) If z mod 2 = 1 Then Exit Do Write(" {0} ", z) Loop ReadLine() End SubEnd Class

Warum wird das Prüfen auf ungerade (dass der Mod-Operator übernimmt,der den Rest einer ganzzahligen Division zurückgibt) nicht beim Loop-Befehldurchgeführt? Weil in diesem Fall die gezogene ungerade Zahl noch ausgege-

Buch-CD: vbnet0413.vb

Page 133: Jetzt lerne ich Visual Basic.NET  GERMAN

133

Wie »schnell« ist Visual Basic .NET?

ben wird, was zwar alles andere als tragisch wäre, in diesem Fall aber nicht er-wünscht ist. Die Schleife muss daher mittendrin über einen »Notausstieg« ver-lassen werden.

4.8 Wie »schnell« ist Visual Basic .NET?

Zum Schluss ein Thema, das (wie einige Dinge in diesem Buch) nicht ganzernst gemeint ist. Es wäre doch einmal interessant herauszufinden, wieschnell Visual Basic .NET im Vergleich zu seinem Vorgänger Visual Basic 6.0ist. Zumindest wäre es interessant zu erfahren, wie lange ein Visual Basic.NET-Programm braucht, um bis 1 Million zu zählen. Diese Dinge lassen sichrelativ einfach herausfinden und bieten eine gute Gelegenheit, die Schleifen-befehle noch einmal zu üben.

3Das folgende Beispielprogramm zählt die Variable j von 1 bis 1 Million (kannauch als 1E6 geschrieben werden) und »misst« dabei die Zeit über die Timer-Funktion der Microsoft.VisualBasic-Kompatibilitätsklasse.

Listing 4-14:Ein kleiner Geschwindig-keitstest mit Schleife

' -------------------------------------------------' Kleiner Schleifenbenchmark' Jetzt lerne ich Visual Basic .NET' -------------------------------------------------Imports System.ConsoleImports Microsoft.VisualBasicClass App

Shared Sub Main() Dim j As Integer Dim VBZeit As Single = Timer() Dim Zahl As Double = 222333444.555 Do j += 1 Zahl = Math.Sqrt(Zahl) Loop Until (j = 20000000) WriteLine("Zeitdifferenz: {0:0.00}s", _ Timer() - VBZeit) ReadLine() End SubEnd Class

In diesem Beispiel kommt die Timer-Funktion der Microsoft.VisualBasic-Kompatibilitätsklasse zum Einsatz. Aus einem einfachen Grund: um das Bei-spiel möglichst einfach zu halten. Über die DateTime-Klasse stehen eine Viel-

Buch-CD: vbnet0414.vb

Page 134: Jetzt lerne ich Visual Basic.NET  GERMAN

134

Kontrollstrukturen4zahl von Eigenschaften, Methoden und Datenstrukturen bereit, die sich alleum das Datum, die Zeit und Zeitintervalle drehen, die allerdings ein wenigverwirrend sein können1 und die Angelegenheit unnötig verkomplizierenwürden.

Und wie schnell ist nun Visual Basic .NET? Nun, solche Messungen sind na-türlich stets alles andere als objektiv. Auf einem System mit 256 Mbyte RAMund einer 700-Mhz-CPU ergab sich ein Wert von 0,88 s. Das »gleiche« Pro-gramm unter Visual Basic 6.0 benötigte (kompiliert als Exe-Datei) auf demgleichen System 0,93 s. Das beweist zumindest an einem sehr simplen Bei-spiel, dass der JIT-Compiler der CLR dem reinen Maschinencode einer mitVisual Basic 6.0 kompilierten Exe-Datei nicht grundsätzlich unterlegen ist.Und das ist bereits ein sehr beruhigendes Gefühl.

4.9 Zusammenfassung

Das war hoffentlich ein angenehm einfaches Kapitel, zumal es gegenüberVorgängerversionen von Visual Basic bei Visual Basic .NET keine Änderun-gen gegeben hat (sieht man einmal von dem Versuch ab, durch die Einfüh-rung des End While-Befehls, der als Alternative zum früheren Wend-Befehlgedacht ist, der bei Visual Basic .NET nicht mehr unterstützt wird, etwasStruktur in die Sprache zu bringen). Die Kontrollstrukturen, die in diesem Ka-pitel vorgestellt wurden, sind praktisch bei jedem Programm dabei, so dass es(in diesem Buch) noch viele Gelegenheiten geben wird, sie zu üben.

4.10 F&A

Frage 4-1

Wie muss ein If-Befehl aussehen, der prüft, ob der Wert einer Variablen z vomTyp Byte ungerade ist und wenn dies der Fall ist, eine entsprechende Mel-dung ausgibt?

Frage 4-2

Wie muss der If-Befehl erweitert werden, dass für den Fall, dass die Zahl ge-rade ist, ebenfalls eine Meldung ausgegeben wird?

Frage 4-3

Sie haben es bei der Quizsendung von Dieter Strauch in die Endrunde ge-schafft und dürfen nun zwischen einem Preis von 5 Millionen € und einem

1. Auch für den Autor.

Page 135: Jetzt lerne ich Visual Basic.NET  GERMAN

135

F&A

Cent wählen, der 30 Tage lang verdoppelt wird. Programmieren Sie eine klei-ne Schleife, die Ihnen die Entscheidung abnimmt.

Frage 4-4

Unter einer Fakultät einer Zahl versteht man die Produkte aller Zahlen verklei-nert um 1 vom Wert der Zahl bis 2 (zum Beispiel 4! = 4 * 3 * 2 = 24). Pro-grammieren Sie eine kleine Konsolenanwendung, die eine Zahl entgegen-nimmt und die Fakultät dieser Zahl ausgibt.

Welches ist die größte Zahl, von der sich die Fakultät berechnen lässt und wo-von hängt dies ab?

Frage 4-5

Eine Primzahl ist eine Zahl, die nur sich und durch 1 teilbar ist. Programmie-ren Sie eine Konsolenanwendung, die alle Primzahlen zwischen 1 und 1000ausgibt. Hier ein kleiner Tipp: Dies ist bereits eine etwas anspruchsvollereAufgabe, bei der zwei For Next-Schleifen ineinander verschachtelt werden.Dabei läuft die äußere Schleife von 1 (bzw. 3) bis 1000, während die innereSchleife bei jedem Durchlauf prüft, ob bei der Division des aktuellen Schlei-fenzählers der äußeren Schleife durch eine der Zahlen von 3 bis zur nächstenganzen Zahl, die größer als die Quadratwurzel des Schleifenzählers ist, einRest von 0 übrig bleibt, sich die zu überprüfende Zahl durch eine andere Zahlalso glatt teilnehmen lässt. (Diese Abbruchbedingung reduziert lediglich dieAnzahl der Durchläufe der inneren Schleife – ansonsten müsste die innereSchleife bis zum Wert des Schleifenzählers der äußeren Schleife minus 1 lau-fen.) In diesem Fall ist die zu prüfende Zahl keine Primzahl und wird nicht aus-gegeben.

Frage 4-6

Wie muss eine Do Loop-Schleife aussehen, die bei jedem Durchlauf einenBuchstaben von der Tastatur entgegennimmt und erst abbricht, nachdem ein»Q« (zusammen mit der Æ-Taste) eingegeben wurde?

(Alle Antworten und Lösungen finden Sie in Anhang D.)

Page 136: Jetzt lerne ich Visual Basic.NET  GERMAN