38
3 C# vs. Visual Basic .NET Dieses Buch behandelt sowohl C# als auch VB.NET. Genauer gesagt, die in diesem Buch aufgeführten Konzepte und Vorge- hensweisen sind auf das .NET Framework bezogen und nicht auf eine bestimmte Sprache. Eigentlich könnte man alles auch mit Hilfe von Eiffel#, J# oder Cobol .NET durchführen. Alle Klassen der Framework Class Library (FCL) sind von jeder .NET-Sprache aus nutzbar. Die beiden Hauptsprachen werden dennoch Visual Basic .NET und C# sein. Welche im Endeffekt überwiegen wird, lässt sich jetzt noch nicht abschätzen. Weil es aber in einem Buch immer sehr unübersichtlich wirkt, wenn das gleiche Beispiel in zwei unter- schiedlichen Sprachen abgedruckt wird, obwohl eigentlich nur die Syntax und einige Operatoren anders sind, wird der Vergleich zwischen den beiden Sprachen in diesem Kapitel gezogen und im Rest des Buches (bis auf wenige Ausnahmen, bei denen es not- wendig ist) Visual Basic .NET verwendet. Dieses Kapitel versetzt Sie in die Lage, die Code-Beispiele leicht von VB.NET nach C# zu konvertieren. Ein Hinweis vorweg: Visual Basic .NET und C# sind sich ähnlicher, als man zunächst vermuten mag. Fast alles, was mit C# möglich ist, lässt sich ebenso gut mit Visual Basic .NET realisieren, und das Dank des .NET Frameworks ohne irgendwelche Geschwindigkeitseinbußen. 3.1 Grundlagen Die Syntax von C# ist recht stark an C++ und an Java angelehnt. Die Syntax von Visual Basic hat sich seit den Urzeiten der Sprache Basic praktisch kaum verändert (trotz des gravierenden Sprungs zwischen Visual Basic 6.0 und Visual Basic .NET, vgl. Kapitel 2). t

3 C# vs. Visual Basic - bilder.buecher.de · 96 3 C# vs. Visual Basic .NET Die Unterschiede zwischen C# und Visual Basic sind nicht so gra-vierend, als dass man Programmcode nicht

Embed Size (px)

Citation preview

3 C# vs. Visual Basic .NET

Dieses Buch behandelt sowohl C# als auch VB.NET. Genauergesagt, die in diesem Buch aufgeführten Konzepte und Vorge-hensweisen sind auf das .NET Framework bezogen und nicht aufeine bestimmte Sprache. Eigentlich könnte man alles auch mitHilfe von Eiffel#, J# oder Cobol .NET durchführen. Alle Klassender Framework Class Library (FCL) sind von jeder .NET-Spracheaus nutzbar.

Die beiden Hauptsprachen werden dennoch Visual Basic .NETund C# sein. Welche im Endeffekt überwiegen wird, lässt sich jetztnoch nicht abschätzen. Weil es aber in einem Buch immer sehrunübersichtlich wirkt, wenn das gleiche Beispiel in zwei unter-schiedlichen Sprachen abgedruckt wird, obwohl eigentlich nur dieSyntax und einige Operatoren anders sind, wird der Vergleichzwischen den beiden Sprachen in diesem Kapitel gezogen und imRest des Buches (bis auf wenige Ausnahmen, bei denen es not-wendig ist) Visual Basic .NET verwendet. Dieses Kapitel versetztSie in die Lage, die Code-Beispiele leicht von VB.NET nach C# zukonvertieren.

Ein Hinweis vorweg: Visual Basic .NET und C# sind sich ähnlicher, alsman zunächst vermuten mag. Fast alles, was mit C# möglich ist, lässtsich ebenso gut mit Visual Basic .NET realisieren, und das Dank des.NET Frameworks ohne irgendwelche Geschwindigkeitseinbußen.

3.1 Grundlagen

Die Syntax von C# ist recht stark an C++ und an Java angelehnt.Die Syntax von Visual Basic hat sich seit den Urzeiten der SpracheBasic praktisch kaum verändert (trotz des gravierenden Sprungszwischen Visual Basic 6.0 und Visual Basic .NET, vgl. Kapitel 2).

t

96 3 C# vs. Visual Basic .NET

Die Unterschiede zwischen C# und Visual Basic sind nicht so gra-vierend, als dass man Programmcode nicht verhältnismäßigschnell umsetzen könnte. Die Syntax von Visual Basic .NET istweit mehr beschreibend als die von C#, dafür sind manche Dingein C# mit weniger Schreibarbeit umsetzbar.

3.1.1 C# ist case-sensitive

Case-sensitive Case-sensitive bedeutet, dass in C# anders als in VB.NET die Groß-/Kleinschreibung überprüft wird. Während in VB.NET die Varia-blenbezeichner aValue und avalue auf die gleiche Variable verweisen(wobei Visual Studio .NET automatisch eine Schreibweise, nämlichdie beim ersten Auftreten der Variable, konsequent durchhält undBezeichner entsprechend korrigiert), muss in C# auf korrekteSchreibweise geachtet werden. aValue und avalue würden in C# alsozwei unterschiedliche Variablen bezeichnen.

Damit ist auch folgende Deklaration in C# durchaus möglich, inVB.NET würde sie zu einem Fehler führen:

Type type = Type.GetType("System.Int32",false,true);

Besonders für Umsteiger von Sprachen wie z.B. Delphi oderVB.NET ist dies ein Kriterium, das sehr oft zu Fehlern führt. DieEntwicklungsumgebung kann natürlich hier nicht eingreifen, dadem Programmierer freigestellt ist, wie er seine Variablen, Felderoder Methoden bezeichnet. Daher muss auf die Schreibweisegeachtet werden.

PascalCasing Es gibt zwei Möglichkeiten, wie man Bezeichner schreiben kann,damit man nicht durcheinander gerät. Die eine ist das so genanntePascalCasing, bei dem ein Bezeichner grundsätzlich mit einemGroßbuchstaben begonnen und jedes weitere Wort innerhalb desBezeichners ebenfalls wieder mit einem Großbuchstaben begon-nen wird.

camelCasing Die zweite Möglichkeit ist das camelCasing, bei dem ein Bezeichnermit einem Kleinbuchstaben begonnen und jedes weitere Wortinnerhalb des Bezeichners wiederum mit einem Großbuchstabenbegonnen wird. Beide Schreibweisen haben den Vorteil, dass dieBezeichner gut lesbar sind. Im Allgemeinen wird in C# eineMischung aus diesen beiden Möglichkeiten verwendet. Wenn mansich danach richtet, was Visual Studio .NET automatisch tut, dannbilden sich folgende Punkte heraus:

Grundlagen 97

� Bezeichner von Klassen werden in PascalCasing geschrieben.

� Bezeichner von Enums, Structs usw. werden ebenfalls in Pas-calCasing geschrieben.

� Bezeichner von Eigenschaften und Ereignissen werden eben-falls in PascalCasing geschrieben.

� Bezeichner lokaler Variablen werden in camelCasing geschrieben.

� Private Felder werden in camelCasing geschrieben, öffentlicheFelder in PascalCasing.

Natürlich bleibt es letztendlich Ihnen als Programmierer überlas-sen, wie Sie Ihre Bezeichner benennen. Eines ist jedoch offensicht-lich geworden, wenn man sich die Beispielprogramme zum .NETFramework ansieht: Die ungarische Notation, die vor allem beiC++-Programmierern sehr beliebt ist, hat im .NET Frameworkausgedient. Eine ähnliche Vorgehensweise wird lediglich noch beiBezeichnern für Komponenten benutzt, damit deren Typ leichtererkennbar ist. Aber auch das ist nicht zwingend notwendig.

3.1.2 Anweisungen und Zeilen

Visual Basic ist von jeher zeilenorientiert, d.h. das Ende einer Zeilebestimmt auch das Ende einer Anweisung. Möchte man mehr alseine Anweisung in einer Zeile unterbringen, kann der Doppel-punkt zum Trennen verwendet werden; benötigt man aus Über-sichtlichkeitsgründen mehrere Zeilen für einen Befehl, so werdendiese Zeilen mittels eines Unterstrichs verbunden. Das kann imQuellcode dann so aussehen:

Visual Basic .NETDim aStr As StringaStr = "Dies ist ein sehr langer String, " + _ "der nicht in eine Zeile passt. Die Anweisung " + _ "muss daher auf mehr als eine Zeile verteilt " + _ "werden."

In C# sieht die Sache ganz anders aus. C# benutzt das Semikolon,um eine Anweisung zu beenden. Damit können Anweisungenleichter auf mehrere Zeilen verteilt werden. Das gleiche Beispiel inC# programmiert würde so aussehen:

C#string aStr;aStr = "Dies ist ein sehr langer String, " + der nicht in eine Zeile passt. Die Anweisung " + muss daher auf mehr als eine Zeile verteilt " + "werden.";

98 3 C# vs. Visual Basic .NET

Die Einrückung dient in beiden Fällen nur der Übersicht. Mansollte sich daran gewöhnen, auch wenn Visual Studio .NET für dieFormatierung im Fall von Visual Basic .NET mehr Hilfe bereitstelltals für C#. Andererseits ist der C#-Programmierer damit auch fle-xibler. Es ist im Prinzip Geschmackssache, was man bevorzugt.

3.1.3 Kommentare

VB.NET-Kommentare

VB.NET-Kommentare

In beiden Sprachen gibt es die Möglichkeit, Quelltext zu kommen-tieren. C# ist in dieser Hinsicht weitaus flexibler als Visual Basic.NET. VB.NET ermöglicht nur einzeilige Kommentare, die entwe-der durch das Wort REM (steht für Remark) oder durch einen Apos-troph eingeleitet werden. Kommentare gehen immer bis zumZeilenende. Hier ein Beispiel für Kommentare in Visual Basic .NET:

REM DeklarationenDim aValue As IntegerDim aStr As Strsing

If aValue > 5 Then 'Vergleich ... Console.WriteLine("Wert ist größer 5")End If

Auch die Version mit REM funktioniert sozusagen mitten in derZeile. Sie könnten also auch schreiben:

If aValue > 5 Then REM Vergleich

C#-Kommentare

C#-Kommentare In C# gibt es zwei Arten von Kommentaren, nämlich einzeiligeund mehrzeilige. Weiterhin haben Sie die Möglichkeit, in C# XML-Kommentare einzufügen, die später durch Visual Studio .NETautomatisch in eine Hilfedatei umgesetzt werden. Ein einfacherKommentar bis zum jeweiligen Zeilenende wird eingeleitet durchzwei aufeinander folgende Schrägstriche.

//Das ist ein Kommentarif ( aValue > 5 ) // das ist auch ein Kommentar Console.WriteLine( "aValue ist größer als 5" );

Kommentare über mehrere Zeilen werden durch die Zeichenfolge/* eingeleitet und durch */ beendet. Visual Studio .NET setzt fürjede neue Zeile automatisch an den Zeilenanfang einen *. Damitsieht ein solcher mehrzeiliger Kommentar folgendermaßen aus:

Grundlagen 99

/* Das ist ein mehrzeiliger Kommentar * Das Visual Studio setzt automatisch das Zeichen * * an den Anfang einer jeden neuen Zeile eines * solchen Kommentars. Abgeschlossen wird er durch */

XML-Kommentare

XML-KommentareXML-Kommentare werden durch drei aufeinander folgendeSchrägstriche eingeleitet. Visual Studio .NET komplettiert diesedann automatisch, weil es erkennt, dass dieser Kommentar alsBeschreibung einer Klasse, einer Eigenschaft oder einer Methodegelten soll. Aus diesem Grund werden einige Informationengleich mit eingefügt. Wenn Sie oberhalb einer Methodendeklara-tion drei Schrägstriche schreiben, vervollständigt Visual Studio.NET dies folgendermaßen:

/// <summary>/// /// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns> private int AddValues(int a, int b) { return a+b; }

<Summary> bezeichnet hierbei die Zusammenfassung über dieBedeutung der jeweiligen Funktion. Die <Param>-Angaben stehenfür jeden übergebenen Parameter, das Tag <returns> steht für denRückgabewert. Wenn Sie entsprechende Eingaben machen unddann die Erstellung der Kommentardatei starten (über EXTRAS/KOMMENTARSEITEN ERSTELLEN), erzeugt Visual Studio .NET eineentsprechende Website mit Informationen über das Projekt undzeigt sie an. Bei den Angaben

/// <summary>/// Die Methode addiert zwei Werte und /// liefert das Ergebnis zurück/// </summary>/// <param name="a">Ein Int32-Wert</param>/// <param name="b">Ein zweiter Int32-Wert</param>/// <returns>Die Summe der beiden Werte</returns> private int AddValues(int a, int b) { return a+b; }

ergibt sich eine Website, wie sie in Abbildung 3.1 dargestellt ist.

100 3 C# vs. Visual Basic .NET

Weitere XML-Kommentare

Die dargestellten XML-Elemente sind allerdings nicht die einzi-gen, die die Entwicklungsumgebung bereitstellt. Tabelle 3.1 zeigtweitere Möglichkeiten von XML-Kommentaren und die jeweiligeBedeutung.

XML-Kommentare sind nur in C# implementiert, nicht in Visual Basic.NET. Es ist allerdings möglich, neue Sprachen ebenfalls mit der Möglich-keit von XML-Kommentaren zu versehen und dieses Feature zu nutzen.

Abbildung 3.1: Die generierte Kommentarseite

XML Bedeutung

<summary> Zusammenfassung bezüglich des aktuellen Elements

<remarks> Übersicht über eine Klasse oder ein Element

<param> Information über einen der Parameter bei Methoden. Der Parameter wird über das Attribut name(***) angegeben.

<returns> Informationen über den Ergebniswert

<newpara> Fügt einen neuen Absatz ein

Tabelle 3.1: XML-Kommentare

t

Grundlagen 101

3.1.4 Codeblöcke

Codeblöcke in VB.NET

In beiden Sprachen werden Codeblöcke benutzt, die mehrereAnweisungen zu einer einzigen zusammenfassen. In Visual Basic.NET ist das dadurch gelöst, dass Klartext benutzt wird. Eine If-Anweisung endet z.B. mit End If, wobei alles, was zwischen Ifund End If steht, als der relevante Codeblock angesehen wird. EineFor Each-Schleife endet mit Next, ebenso wie eine For-Schleife. EineDo-Schleife endet mit Loop. Für den Programmierer ist somit immerklar ersichtlich, wo der Anweisungsblock endet, denn er kann eseinfach ablesen.

Codeblöcke in C#In C# werden Codeblöcke grundsätzlich in geschweifte Klammerneingeschlossen. Das gilt ausnahmslos für alle Codeblöcke, alsoauch für Methoden, Namespaces, Klassen (das wäre in VisualBasic .NET z.B. End Class) und auch Schleifen. Für einen Program-mierer, der die C++-Syntax (oder die Java-Syntax) gewohnt ist,sind diese Codeblöcke leicht erkennbar; Programmierer, die voneiner Sprache wie Visual Basic 6.0 umsteigen, werden sich anfangsein wenig daran gewöhnen müssen. Gerade bei C# ist es daherenorm wichtig, mit Hilfe von Einrückungen die Übersicht zubehalten (wobei Visual Studio .NET wieder hilft).

Auch hier ein kleines Beispiel:

Visual Basic .NETIf aValue > 5 Then x = x + 1 aValue = aValue + xEnd If

In C# werden alle Codeblöcke über geschweifte Klammern einge-schlossen. Die gleiche Anweisung würde also in C# folgender-maßen aussehen:

C#if ( aValue > 5 ){ x += 1; aValue = aValue + x;}

Oft gehen C#-Programmierer (wie auch C++- oder Java-Program-mierer) so vor, dass sie die öffnende geschweifte Klammer in diegleiche Zeile schreiben wie die eigentliche Anweisung, der einCodeblock folgt. Das Beispiel sähe dann so aus:

C#if ( aValue > 5 ) { x += 1; aValue = aValue + x}

102 3 C# vs. Visual Basic .NET

3.1.5 Option-Statements

In Visual Basic .NET gibt es die Statements Option Explicit, OptionStrict und Option Compare, die sowohl global für ein Projekt alsauch nur für eine Datei eingestellt werden können. Von Hause auswerden diese Einstellungen allerdings von Visual Studio .NETetwas versteckt, Sie finden sie im Optionsdialog zu einem Projekt.

Option Explicit Mit Option Explicit können Sie angeben, ob Variablen in VisualBasic .NET-Projekten vor ihrer erstmaligen Verwendung deklariertwerden müssen. Nicht deklarierte Variablen führen dann zueinem Fehler. Andersherum, mit der Einstellung Option ExplicitOff, kann der Compiler aber nicht wissen, welchen Datentyp eineVariable annehmen soll, wenn sie nicht deklariert wurde. Aus die-sem Grund ist der Datentyp einer nicht deklarierten Variableimmer Object.

Option Strict Option Strict betrifft implizite Typkonvertierungen. Standardmä-ßig ist der eingestellte Wert »Off«. Wenn Option Strict eingeschal-tet ist, müssen implizite Typkonvertierungen, z.B. von Decimalnach Integer, über CInt() oder CType() durchgeführt werden.

Option Compare Option Compare betrifft den Vergleich von Strings. Standardmäßigist hier die binäre Vergleichsart eingestellt, bei der Strings anhandeiner internen Sortierreihenfolge verglichen werden. In der Ein-stellung »On« wird die Sortierreihenfolge des aktuellen Gebiets-schemas verwendet.

Diese drei Optionen gibt es in C# nicht. C# verhält sich grundsätz-lich entsprechend der Einstellungen

Option Explicit OnOption Strict OnOption Compare On

Teilweise muss man darauf achten, wenn man bestehende VisualBasic .NET-Projekte in C# umschreiben möchte, je nachdem wiediese Optionen eingestellt sind. Wenn Sie mit beiden Sprachenarbeiten, sollten Sie Visual Basic .NET so konfigurieren, dass essich wie C# verhält.

3.1.6 Schlüsselwörter

Die Schlüsselwörter beider Sprachen unterscheiden sich. Teilsbesitzt Visual Basic .NET ein Schlüsselwort, das so nicht in C# ent-halten ist; andererseits besitzt auch C# einige Schlüsselwörter, die

Grundlagen 103

man in Visual Basic .NET nicht findet. Meist existiert jedoch einÄquivalent mit gleicher Bedeutung. Tabelle 3.3 zeigt einige Schlüs-selwörter im Überblick, erhebt jedoch keinen Anspruch auf Voll-ständigkeit. Sortiert ist die Tabelle nach den Namen der VB.NET-Schlüsselwörter.

VB.NET C# Bedeutung

AddHandler Mit AddHandler wird eine Ereignisbehandlungsrou-tine einem Ereignis zugewiesen. AddHandler wird im Zusammenhang mit AddressOf verwendet, da nicht die Ereignisbehandlungsroutine selbst, sondern deren Adresse benötigt wird. Die Verwendung von AddHandler entspricht dem Abonnieren eines Ereig-nisses in C# über den +=-Operator.

Class class Deklariert eine neue Klasse

Const const Deklariert eine Konstante

Delegate delegate Deklariert einen Delegate

Event event Deklariert ein Ereignis

Friend internal Gibt an, dass das Feld zwar von außerhalb der Klasse, aber nur von innerhalb des aktuellen Projekts angesprochen werden kann

Handles Gibt an, welches Ereignis die Methode bearbeiten soll. Bei Auftreten dieses Ereignisses wird dann die Methode aufgerufen. In C# wird die aufzurufende Methode der Liste von EventHandlern des Ereignis-ses unter Verwendung des +=-Operators hinzuge-fügt.

Inherits : Bezeichnet die Basisklasse bei der Klassendeklara-tion, von der abgeleitet wird

Implements : Gibt an, welche Schnittstelle von einer Klasse implementiert wird. In C# wird dies wie auch die Ableitung von einer Basisklasse durch den Doppel-punkt implementiert.

Imports using Importiert einen Namespace, so dass dessen Klas-sen benutzt werden können. Das Imports-State-ment von Visual Basic .NET ist dabei auch in der Lage, Klassen zu importieren, deren statische Methoden dann ohne Angabe des Klassennamens benutzt werden können.

Interface interface Deklariert eine Schnittstelle

Me this Referenziert das aktuelle Objekt

Tabelle 3.2: Schlüsselwörter in C# und VB.NET

104 3 C# vs. Visual Basic .NET

MustInherit

abstract Deklariert eine Klasse, von der abgeleitet werden muss, bevor sie verwendet werden kann

MustOver-ride

abstract Deklariert eine Methode, die in einer abgeleiteten Klasse implementiert werden muss

MyBase base Referenziert die Basisklasse der aktuellen Klasse, also die Klasse, von der abgeleitet wurde

New New Erzeugt eine neue Instanz einer Klasse

NotInheritable

sealed Wird bei der Klassendeklaration verwendet. Deklariert die Klasse als nicht ableitbar, man bezeichnet diese auch als »versiegelte Klasse«.

NotOverridable

sealed Deklariert eine Methode, die in einer abgeleiteten Klasse nicht überschrieben werden kann

Overloads Überlädt eine Methode. Das funktioniert in C# automatisch ohne Angabe eines Modifizierers.

Overri-dable

virtual Gibt an, dass diese Methode überschrieben werden kann

Overrides override Überschreibt eine Methode

Private private Deklaration als privat, von außen kann nicht zuge-griffen werden

Protected protected Gibt an, dass das aktuelle Element nur von dieser Klasse oder von abgeleiteten Klassen angesprochen werden kann

Public public Deklaration als öffentlich

ReadOnly Deklariert eine Eigenschaft nur zum Lesen

Static Nur für lokale Variablen: Eine mit Static dekla-rierte Variable behält ihren Wert auch nach Be-endigung der Methode.

Shadows Verdeckt ein Element der Basisklasse. Wenn Sie ein Element (eine Methode oder ein öffentliches Feld) verdecken, kann auf dieses unter Verwendung der abgeleiteten Klasse nicht mehr zugegriffen werden.

Shared static Deklariert ein statisches Element einer Klasse. Diese Elemente sind Bestandteile der Klasse und werden nicht über den Namen einer Instanz, son-dern über den Namen der Klasse selbst angespro-chen.

Structure struct Deklariert einen zusammengesetzten Datentyp (einen Wertetyp, für Referenztypen wird eine Klasse deklariert)

VB.NET C# Bedeutung

Tabelle 3.2: Schlüsselwörter in C# und VB.NET (Fortsetzung)

Grundlagen 105

3.1.7 Operatoren

Viele der in VB.NET und C# verwendeten Operatoren sind gleich,die Unterschiede sind recht schnell aufgelistet.

Vergleich auf Gleichheit bei Zahlen

Vergleiche und Zuweisungen werden in Visual Basic .NET durchden gleichen Operator durchgeführt, nämlich durch das Gleich-heitszeichen. In C#, das ja C++ und Java als syntaktisches Vorbildhat, wird für die Zuweisung ein einfaches Gleichheitszeichen ver-wendet, für den Vergleich allerdings ein doppeltes. Ein Vergleichin VB.NET könnte so aussehen:

Visual Basic .NETDim i As IntegerFor i = 1 To 10 If i = 5 Then Console.WriteLine( i ) End IfNext

Das gleiche Programmfragment in C# sähe so aus:

C#for ( int i=1; i<=10; i++ ) { if ( i == 5 ) Console.WriteLine( i );}

Die Unterschiede bzgl. der for-Schleife bzw. der If-Bedingungwerden in einem späteren Abschnitt noch angesprochen. In die-sem Fall geht es nur um den Vergleich, ob die Variable i tatsäch-lich den Wert 5 enthält, denn nur dann wird sie ausgegeben.

WithEvents Gibt eine Variable an, die ein Objekt enthält, des-sen Ereignisse genutzt werden können. In C# gibt es hierfür ein anderes Konzept, d.h. man muss Code schreiben, um einem Delegate eine Ereignis-behandlungsroutine hinzuzufügen.

WriteOnly Deklariert eine Eigenschaft nur zum Schreiben

extern Gibt an, dass diese Methode extern (also in einer DLL) deklariert ist

unsafe Deklariert einen Block mit unsicherem Code in C#

volatile Deklariert ein Objekt, das asynchron geändert werden kann

VB.NET C# Bedeutung

Tabelle 3.2: Schlüsselwörter in C# und VB.NET (Fortsetzung)

106 3 C# vs. Visual Basic .NET

Vergleich zweier Objekte

Is-Operator Zum Vergleich, ob zwei Objekte identisch sind, muss in VisualBasic .NET der Is-Operator benutzt werden. In C# gibt es hierkeine Änderung zum herkömmlichen Vergleichsoperator, derauch zum Vergleichen zweier Objekte benutzt werden kann. EinBeispiel in Visual Basic .NET:

Visual Basic .NET Dim arrList1 As New ArrayList()Dim arrList2 As ArrayList = arrList1

If arrList2 Is arrList1 Then Console.WriteLine( "True" )End If

In C# würde dieser Vergleich folgendermaßen aussehen:

C# ArrayList arrList1 = new ArrayList();ArrayList arrList2 = arrList1;

if ( arrList1 == arrList2 ) Console.WriteLine( "true" );

Der folgende Vergleich führt allerdings in beiden Fällen zumErgebnis False, da es sich nicht um das gleiche Objekt handelt,sondern lediglich um den gleichen Datentyp:

Visual Basic .NET Dim arrList1 As New ArrayList()Dim arrList2 As New ArrayList()

If arrList2 Is arrList1 Then Console.WriteLine( "True" )Else Console.WriteLine( "False" )End If

TypeOf und typeof Um zu kontrollieren, ob ein Objekt einem bestimmten Datentypentspricht, muss in Visual Basic .NET der TypeOf-Operator verwen-det werden. Einen solchen Operator gibt es auch in C#, dort abermit einer anderen Bedeutung. Während der Einsatz von TypeOf(VB.NET) lediglich innerhalb eines Vergleichs möglich ist, lieferttypeof (C#) ein Objekt vom Typ Type zurück, das den Datentyprepräsentiert.

Ein Vergleich darauf, ob ein Objekt eine Instanz eines bestimmtenDatentyps ist, sähe in Visual Basic .NET folgendermaßen aus:

Visual Basic .NET Dim arrList1 As New ArrayList

If TypeOf arrList1 Is ArrayList Then Console.WriteLine( "True" );End If

Grundlagen 107

Das C#-Äquivalent benutzt hier den is-Operator:

C#ArrayList arrList1 = new ArrayList();

if ( arrList1 is ArrayList ) Console.WriteLine( "true" );

Solche Vergleiche sind vor allem dann notwendig, wenn man kon-trollieren will, ob eine bestimmte Schnittstelle und damit einebestimmte Funktionalität von einer Klasse implementiert wird. Siekönnen ebenfalls kontrollieren, ob eine Klasse von einer anderenKlasse abgeleitet ist. Der Vergleich auf den Basistyp einer Klasseliefert in diesem Fall ebenfalls true.

Vergleich mit System.Object

Immer den Wert true liefert ein Vergleich eines Referenztypsdarauf, ob er vom Typ System.Object ist. System.Object ist der Basis-typ aller Datentypen im .NET Framework und damit muss ein sol-cher Vergleich zwangsläufig mit einem wahren Ergebnis enden.Umgekehrt funktioniert es aber auch. Wenn Sie Boxing verwen-den, eine Technik, bei der ein Datentyp in den Datentyp Objectgekapselt (nicht konvertiert) wird, können Sie über einen solchenVergleich herausfinden, welcher Datentyp in diesem Objekt ver-steckt ist.

Visual Basic .NETDim arrList1 As New ArrayList()Dim o As Object

arrList1.Add("Ein String")arrList1.Add(10)arrList1.Add("Noch ein String")

For Each o In arrList1 If TypeOf o Is String Then Console.WriteLine( "String" ) Else Console.WriteLine( "Integer" ) End IfNext

liefert die Ausgabe:

StringIntegerString

108 3 C# vs. Visual Basic .NET

Vergleich auf Ungleichheit

Auf Ungleichheit wird in Visual Basic .NET mit der Kombinationvon Größer- und Kleiner-Zeichen verglichen. C# lehnt sich hierebenfalls wieder an die Syntax von C++ an und benutzt die Zei-chenfolge !=. Das entspricht in Visual Basic .NET dem Operator <>:

Visual Basic .NET Dim i As IntegerFor i = 1 To 10 If i <> 5 Then Console.WriteLine( i ) End IfNext

Das gleiche Programmfragment in C#:

C# for ( int i=1; i<=10; i++ ) { if ( i != 5 ) Console.WriteLine( i );}

Bedingte Zuweisung

IIf In Visual Basic .NET gibt es eine nützliche Funktion namens IIf,mit der eine einfache Zuweisungsart ermöglicht wird. Der ersteParameter ist ein Ausdruck, der einen booleschen Wert ergibt. Derzweite Parameter ist das Ergebnis, das zurückgeliefert wird, wennder Ausdruck True ergibt; der dritte Parameter wird zurückgelie-fert, wenn der Ausdruck False ergibt.

BedingteZuweisung

In C# ist dies wieder auf typische C++-Weise gelöst: Auch hier gibtes die Möglichkeit einer Bedingten Zuweisung, bei der es sich aller-dings nicht um eine Methode handelt, sondern um einen Bestand-teil der Sprachdefinition selbst. Die C#-Version ist ein wenigkryptischer zu lesen – wenn man sich aber daran gewöhnt hat, istsie recht übersichtlich.

Die Syntax der bedingten Zuweisung in C# sieht folgendermaßenaus:

x = <Ausdruck> ? <Ergebnis wahr> : <Ergebnis falsch>;

Zum Vergleich ein Beispiel in Visual Basic .NET und C#:

Visual Basic .NET Public Function CheckValue(ByVal Value As Integer) _ As String Return CStr(IIf(Value > 5, "Ja", "Nein"))End Function

Deklarationen 109

Das gleiche Fragment in C#:

C#public string checkValue( int Value ) { return (Value > 5)? "Ja":"Nein";}

Während – wie zu sehen ist – in C# direkt der richtige Datentypzurückgeliefert werden kann, muss bei Verwendung von IIf inVisual Basic .NET noch konvertiert werden. IIf liefert das Ergebnisimmer als Wert vom Typ Object zurück, eine Konvertierung ist alsonotwendig. Standardmäßig erledigt Visual Basic .NET das automa-tisch, da Option Strict auf »Off« steht, die Konvertierung wird aberdennoch vorgenommen.

3.2 Deklarationen

3.2.1 Klassen und Module

Die Art der Programmierung mit Visual Basic hat sich stark geän-dert. War es vorher noch so, dass sich Module und Klassen durchdie Art des Zugriffs unterschieden haben und in einem Moduldeklarierte Variablen global für das gesamte Programm gültigwaren, so hat ein Modul unter .NET eine andere Bedeutung. Auchgibt es keine globalen Funktionen oder Subs mehr, diese müssenimmer Bestandteil einer Klasse sein und heißen dann Methoden.Über den Modifizierer shared können Methoden (wie auch Varia-blen) aber auch zu einem Bestandteil der Klasse gemacht werden, sodass der Zugriff statt auf Objektebene auf Instanzebene stattfindet.

ModuleEin Modul in .NET ist eine ausführbare Datei (EXE oder DLL), diezumindest eine Klasse enthält. Der Unterschied zwischen einerAssembly und einem Modul ist der, dass eine Assembly noch einManifest beinhaltet, das sie selbstbeschreibend macht. EineAssembly besitzt auch die Endung .exe oder .dll, kann aber meh-rere Module enthalten.

KlassenKlassen sind so etwas wie die Grundlage der Programmierung im.NET Framework. Ohne Klassen funktioniert nichts. Globale Variab-len, wie sie aus Visual Basic 6 bekannt waren, gibt es in dieser Formnicht mehr, ebenso wenig wie allgemein gültige Funktionen oderSubs. Diese müssen nun immer Bestandteil einer Klasse sein.

Die Felder, Eigenschaften und Methoden einer Klasse werdenauch unter dem Oberbegriff Member zusammengefasst.

110 3 C# vs. Visual Basic .NET

Wenn Sie Members einer Klasse mit dem Modifizierer shared (oderstatic in C#) versehen, können Sie globale Methoden oder Variablensimulieren. Da der Zugriff auf Klassenebene geschieht, können alle Pro-grammbestandteile, die den entsprechenden Namespace, in dem dieKlasse deklariert ist, eingebunden haben, auf diese Members zugreifen.Da keine Instanz der Klasse erzeugt wird, verhalten sich die Membersdann wie globale Funktionen, Subs oder Variablen.

Die Definition einer Klasse erfolgt in beiden Sprachen über dasreservierte Wort Class. Wie in Visual Basic üblich wird das Endeeiner Klasse durch eine End-Anweisung (End Class) angezeigt. InC# werden die Member der Klasse in geschweifte Klammern ein-gefasst.

Visual Basic .NET Class myClass Private aField As Integer Private aSecondField As IntegerEnd Class

Die gleiche Deklaration in C# sieht folgendermaßen aus:

C# class myClass { private int aField private int aSecondField}

Um mit einer Klasse arbeiten zu können, müssen Sie zunächst eineInstanz der Klasse, ein Objekt, erzeugen. Das geschieht durch denAufruf des Konstruktors über das Schlüsselwort New. Mehr überKonstruktoren und Destruktoren finden Sie in Abschnitt 3.2.5.

3.2.2 Variablen und Felder

Syntax VB.NET VB.NET verwendet für Deklarationen lokaler Variablen dasSchlüsselwort Dim, das es in C# nicht gibt. Stattdessen wird in C#der Datentyp vor den Bezeichner geschrieben. Damit ergibt sichfolgende Syntax für die Deklaration einer Variablen in VB.NET:

Dim Variablenname As Datentyp

Im Falle von Feldern, also Attributen einer Klasse, kann dasSchlüsselwort Dim auch weggelassen werden; in diesem Fall wer-den lediglich die Sichtbarkeitsstufe und mögliche weitere Op-tionen dargestellt, also z.B.:

Public Shared Variablenname As Datentyp

t

Deklarationen 111

Die Deklaration einer lokalen Integer-Variablen sähe also inVB.NET so aus:

Dim aValue As Integer

Syntax C#In C# gibt es kein spezielles Schlüsselwort für die Deklaration vonVariablen oder Feldern. Die Syntax für eine lokale Variable siehtfolgendermaßen aus:

Datentyp Variablenname;

Bei der Deklaration von Feldern ist es das Gleiche, allerdings wer-den auch hier Sichtbarkeitsstufen und Ähnliches davor geschrie-ben:

public static Datentyp Variablenname;

Damit sieht die gleiche Deklaration einer Variablen vom Typ Integerin C# so aus:

int aValue;

AliaseDie Namen Integer in VB.NET und int in C# sind Aliase für dengleichen Datentyp, der im .NET Framework als Int32 im Name-space System deklariert ist. Alternativ könnte man also auch denkorrekten Namen verwenden. Wer oft mit unterschiedlichen Pro-grammiersprachen arbeitet, z.B. mit C# eine DLL erstellt unddiese dann in einem VB.NET-Projekt weiterverwendet, ist sogargut beraten, die Originalnamen zu verwenden, da die Verwechs-lungsgefahr damit quasi nicht mehr vorhanden ist:

Dim aValue As System.Int32

bzw. in C#:

System.Int32 aValue;

3.2.3 Methoden

Sub und FunctionAuch die Deklaration von Methoden einer Klasse gestaltet sich inVB.NET wesentlich anders als in C#. Während VB.NET durch dieSchlüsselwörter Sub und Function Methoden mit und ohne Ergeb-niswert unterscheidet, wird bei C# immer ein Ergebniswert ange-geben und die Deklaration ist ebenfalls immer die gleiche.Methoden, die kein Ergebnis liefern, haben den speziell dafür vor-gesehenen Wert void.

112 3 C# vs. Visual Basic .NET

Dadurch gibt es in C# natürlich auch kein Schlüsselwort, das eineMethode mit Ergebniswert von einer ohne Ergebniswert unter-scheidet. Die Syntax der Deklaration einer Sub sieht in Visual Basic.NET folgendermaßen aus:

Syntax VB.NET Private Sub Bezeichner ( [ Parameter As Datentyp, … ] )

In C# ist auch hier wieder weniger Schreibarbeit gefordert:

Syntax C# private void Bezeichner ( [ Datentyp Parameter ] )

Exit Sub und ExitFunction

Was Visual Basic .NET mehr hat, sind die Anweisungen Exit Subbzw. Exit Function zum Verlassen einer Methode. In C# gibt eskein direktes Äquivalent, allerdings kann hier über die Anwei-sung return eine Methode verlassen werden, auch wenn sie keinErgebnis zurückliefert.

Return Das Ergebnis einer Function bzw. einer Methode mit Ergebniswertwird in beiden Sprachen mit Return (bzw. return in C#) zurückge-liefert. Alternativ kann der Ergebniswert in Visual Basic .NETauch dem Funktionsnamen zugewiesen werden.

Private Function AddValues(ByVal a As Integer, _ ByVal b As Integer) As Integer Return a+bEnd Function

oder

Private Function AddValues(ByVal a As Integer, _ ByVal b As Integer) As Integer AddValues = a+bEnd Function

3.2.4 Eigenschaften

Properties Sowohl Visual Basic .NET als auch C# unterstützen die Definitionvon Datenmitgliedern in Klassen (also Attributen) durch Eigen-schaften (engl. Properties) statt durch Felder (siehe Abschnitt3.2.2).

In Klassen kann man Properties definieren, um dem Anwenderden direkten Zugriff auf die Daten des Objekts zu verweigern, z.B.wenn ein Wert nur ausgelesen, nicht aber verändert werden soll.Anstatt direkt auf die Daten zuzugreifen, wird bei einer Propertysowohl beim Lesen als auch beim Schreiben Programmcode aus-geführt und man hat die volle Kontrolle über die erlaubten Werteund die Art der Speicherung. Dabei definiert man in der Regel

Deklarationen 113

zusätzlich zu der Property ein privates Feld für die tatsächlicheSpeicherung des Wertes.

VB.NETIn Visual Basic .NET ist die Vorgehensweise normalerweise so,dass man den Namen des privaten Feldes mit einem Unterstrichbeginnt und der Eigenschaft den gleichen Namen wie dem Feldgibt, auf das man zugreifen will. Natürlich ohne Unterstrich. Dasist notwendig, weil VB.NET nicht case-sensitive arbeitet, alsonicht zwischen Groß- und Kleinschreibung unterscheidet. DieDeklaration einer Eigenschaft geschieht über das reservierte WortProperty:

Visual Basic .NETprivate _feld As String ' Das Feld selbst

Public Property Feld() As String ' Die Eigenschaft Get Return _feld End Get Set(ByVal Value As String) _feld = Value End SetEnd Property

ReadOnlyDie Zugriffsmöglichkeiten und noch einige weitere Dinge werdenwie in beiden Sprachen üblich durch Modifikatoren angegeben.Eine Eigenschaft, die nur zum Lesen vorgesehen ist, wird mitHilfe des Modifizierers ReadOnly deklariert:

Visual Basic .NETPublic ReadOnly Property Feld() As String Get Return _feld End GetEnd Property

Get und Set-Methoden

Die Methoden Get und Set werden von Visual Studio .NET auto-matisch eingefügt, nachdem Sie die erste Zeile der Deklarationgeschrieben haben. In diesem Fall hilft Visual Studio .NET alsobeträchtlich weiter. Wenn Sie z.B. den Modifizierer ReadOnly ange-geben haben, wird auch nur eine Get-Methode generiert; haben SieWriteOnly angegeben, wird lediglich eine Set-Methode generiertmit einem Parameter Value, der den gleichen Datentyp hat wie inder Property-Deklaration angegeben.

C#In C# gestaltet sich die Deklaration ein wenig anders. Zunächstkönnen Feldbezeichner und Eigenschaftsbezeichner die gleichensein, da C# ja zwischen Groß- und Kleinschreibung unterscheidet.Man schreibt einfach das Feld in camelCasing, die Eigenschaft in

114 3 C# vs. Visual Basic .NET

PascalCasing (wie auch vorher beschrieben). C# kennt das reser-vierte Wort Property nicht und benötigt es auch nicht. Stattdessenwird gleich mit dem Codeblock begonnen.

Allerdings ist die Hilfe des Visual Studio .NET hier faktisch nichtvorhanden, es wird davon ausgegangen, dass der Programmiererweiß, was er tut. Die Methoden get und set (sie heißen in C#genauso, allerdings klein geschrieben) müssen Sie selbst schrei-ben:

C# private string feld;

public string Feld { get { return feld; } set { feld = value; }}

Value Für manche, die sich noch nicht mit den geschweiften Klammernangefreundet haben, mag diese Syntax etwas verwirrend sein, dain der Methode Set ebenfalls ein Parameter value verwendet wird,dessen Datentyp dem entspricht, der in der Deklaration der Eigen-schaft angegeben wurde. Dieser ist aber nicht deklariert, d.h. manmuss wissen, dass es ihn automatisch gibt und man ihn verwen-den kann. Hat man sich einmal daran gewöhnt, ist die C#-Syntaxein wenig übersichtlicher, da der relevante Text sofort sichtbar ist.

Readonly-Eigenschaft

Wenn Sie mit C# eine Eigenschaft deklarieren wollen, die nur zumLesen verfügbar ist, so benötigen Sie dafür keinen Modifizierer,Sie lassen einfach die Set-Methode weg. Eine Nur-Lese-Eigen-schaft würde also in C# folgendermaßen aussehen:

C# public string Feld { get { return feld; } }

In C# haben Sie also – was Eigenschaften betrifft – die bessereÜbersichtlichkeit, aber die schlechtere Mithilfe des Visual Studio.NET.

3.2.5 Konstruktoren und Destruktoren

Visual Basic .NET ist jetzt vollständig objektorientiert, d.h. Siekönnen eigene Klassen erstellen und von vorhandenen Klassenerben. C# wurde von Haus aus bereits objektorientiert aufgebautund orientiert sich in der Syntax an Sprachen, die bereits in derVergangenheit objektorientierte Eigenschaften und Möglichkeitenbeinhalteten.

Deklarationen 115

Konstruktoren

Konstruktoren werden aufgerufen, wenn eine neue Instanz einerKlasse erzeugt werden soll. In beiden Fällen lautet das entspre-chende Schlüsselwort New (in VB.NET groß geschrieben, in C#klein). Der Konstruktor selbst wird in VB über eine Methode mitdem Namen New deklariert, die Parameter enthalten kann (abernicht muss) und keinen Ergebniswert beinhaltet (also eine Sub).Die Deklaration sieht dann folgendermaßen aus:

Visual Basic .NETPublic Class AnyClass

' Methoden, Felder, Eigenschaften, Ereignisse ' sind hier nicht mit angegeben

Public Sub New () 'Das ist der Konstruktor End Sub

End Class

Eine Klasse kann natürlich auch mehrere Konstruktoren besitzen.In C# sieht die Deklaration ein wenig anders aus, sie ist hier vonC++ abgeleitet. Der Konstruktor besteht in einer Methode mit demgleichen Namen wie die Klasse. Es wird in diesem Fall kein Ergeb-niswert (also auch nicht void) angegeben. Die gleiche Klassewürde also in C# folgendermaßen deklariert:

C#public class AnyClass {

// Methoden, Felder, Eigenschaften, Ereignisse // sind hier nicht mit angegeben

public AnyClass() { //Dies ist der Konstruktor }}

Auch hier ist die Angabe mehrerer Konstruktoren möglich.

Destruktoren (Finalizer)

Destruktoren und Garbage Collec-tion

Im Bezug auf Destruktoren muss man im .NET Framework etwasvorsichtig sein. Ein C++-Programmierer versteht unter einem De-struktor eine Methode, die dann aufgerufen wird, wenn das Ob-jekt seinen Gültigkeitsbereich verlässt – der Aufruf ist alsovorhersehbar. Im .NET Framework ist das nicht so. Destruktorenwerden hier von der automatischen Garbage-Collection aufgeru-

116 3 C# vs. Visual Basic .NET

fen, zu einem Zeitpunkt, der nicht vorhersehbar ist. Microsoftselbst sagt sogar, dass es unter gewissen Umständen möglich ist,dass ein Destruktor nie aufgerufen wird.

Finalizer Destruktoren heißen daher im .NET Framework auch Finalizer.Die Bezeichnung Destruktor wurde lediglich beibehalten, umC++-Programmierern einen schnelleren Umstieg zu ermöglichen.Sie wurde auch erst in der Beta 2 eingeführt, in Beta 1 hieß es aus-nahmslos Finalizer. Daher kommt auch die Bezeichnung für dieentsprechende Methode, die Sie in VB.NET deklarieren könnenund die dann aufgerufen wird, wenn ein Objekt freigegeben wird.Sie heißt Finalize(), hat ebenfalls keinen Ergebniswert und auchkeine Parameter (da sie von der Garbage-Collection aufgerufenwird und nicht aus dem Programm heraus).

Die Deklaration eines Finalizers (oder Destruktors) in VB.NETsieht also folgendermaßen aus:

Visual Basic .NET Public Class AnyClass

' Methoden, Felder, Eigenschaften, Ereignisse ' sind hier nicht mit angegeben

Public Sub New () 'Das ist der Konstruktor End Sub

Public Sub Finalize() 'Das ist der Finalizer End SubEnd Class

C# ist wieder an C++ angelehnt. Dort wird wieder der Klassen-name als Bezeichner für den Destruktor verwendet, diesmal abermit dem Umkehrzeichen (der Tilde, ~ ). Auch diese Methode hatkeinen Ergebniswert.

C# public class AnyClass {

// Methoden, Felder, Eigenschaften, Ereignisse // sind hier nicht mit angegeben

public AnyClass() { //Dies ist der Konstruktor }

public ~AnyClass() { //Dies ist der Destruktor }}

Programmiertechniken 117

Normalerweise werden Sie in eigenen Klassen keinen Destruktorbenötigen. Sie müssen ihn nicht deklarieren – Sie dürfen aber.Allerdings empfiehlt es sich nicht, weil man die Garbage-Collec-tion damit sehr leicht durcheinander bringen kann. Wenn Siewirklich Aufräumarbeiten durchführen wollen – und nur dazusind Finalizer wirklich geeignet –, sollten Sie die MethodeDispose() bzw. die Methode Close() implementieren. Auch in denKlassen des .NET Frameworks ist das so gemacht. Lassen Sie dieGarbage-Collection einfach arbeiten, betrachten Sie sie als eineBlack-Box und verwenden Sie Finalizer respektive Destruktorennur dann, wenn Sie genau wissen, was Sie tun, und wenn es unbe-dingt notwendig ist.

3.3 Programmiertechniken

3.3.1 Schleifen

Schleifen sind Konstruktionsmerkmale einer jeden Programmier-sprache. In Visual Basic .NET und C# sind vier verschiedeneSchleifentypen implementiert, die unterschiedlich flexibel sind.Im Großen und Ganzen ist aber mit der einen Sprache auch dasmöglich, was die andere Sprache kann.

For-Schleife

Mit der For-Schleife können Anweisungen oder Anweisungsblö-cke mehrfach wiederholt werden. In Visual Basic .NET nutzt dieFor-Schleife eine Laufvariable, mit deren Hilfe die Anzahl derDurchläufe festgelegt wird. C# ist da flexibler, d.h. die Schleifen-konstruktion folgt einem ganz anderen Ansatz und bietet damitmehr Möglichkeiten.

Die Syntax einer For-Schleife in Visual Basic .NET stellt sich wiefolgt dar:

Syntax VB.NETFor Laufvariable = Start To Ende [Step Schrittweite] Anweisungen [ Exit For ] AnweisungenNext

Es wird also immer eine Laufvariable benötigt, mit der gezähltwird und der ein Anfangs- bzw. Endwert angegeben wird. Schritt-

118 3 C# vs. Visual Basic .NET

weite gibt an, um wie viel die Laufvariable jeweils erhöht odererniedrigt werden soll, da die For-Schleife ja auch rückwärts zäh-len kann.

Die Anweisung Exit For weist Visual Basic .NET an, die For-Schleife zu verlassen; die Anweisung Next startet den nächstenSchleifendurchlauf. Ein typisches Beispiel für eine For-Schleifewäre das folgende:

Visual Basic .NET Dim i As IntegerFor i = 1 To 1000 Console.WriteLine( i )Next

Das Äquivalent von C# ist in dieser Hinsicht ein gutes Stück fle-xibler, da es nicht von einer Laufvariable abhängig ist, aber einebenutzen kann. Die entsprechende Syntax in C# sieht wie folgtaus:

Syntax C# for ([Initialisierung];[Abbruchbedingung];[Iteration]) { Anweisungen [ break; ] [ continue; ] Anweisungen}

Initialisierung legt den Startwert einer etwaigen Laufvariablen fest.Abbruchbedingung legt fest, bei welcher Bedingung die Schleifeverlassen werden soll, nämlich dann, wenn die Abbruchbedin-gung False wird. Iteration erhöht oder erniedrigt die Laufvariableum einen bestimmten Wert. Bei den Anweisungen kann es sichum eine einzelne Anweisung oder um einen Anweisungsblockhandeln, der dann aber in geschweifte Klammern gesetzt werdenmuss. Die geschweiften Klammern werden nicht benötigt, wennes sich lediglich um eine Anweisung handelt, die ausgeführt wer-den soll.

Das gleiche Beispiel in C#-Syntax sieht wie folgt aus:

C# for ( int i=1; i<=1000; i++ ) Console.WriteLine( i );

In dieser Schleife wird die Laufvariable direkt im Schleifenkopfdeklariert und ist somit auch nur innerhalb der Schleife gültig.Das funktioniert in VB nicht, da hier die Variable vorher deklariertwerden muss (Option Explicit On immer vorausgesetzt). DieSchleife wird abgebrochen, wenn i größer wird als 1000, und beijedem Schleifendurchlauf wird i um eins erhöht.

Programmiertechniken 119

Initialisierungsbedingung und Iteration sind aber optional, d.h.auch folgende Schleife würde funktionieren:

C#int i = 1;for ( ; i<=1000 ;) { Console.WriteLine( i ); i++;}

Hier ist keine Initialisierung innerhalb der Schleife angegeben undauch der Iterator fehlt. Dennoch funktioniert es, weil die Variable iinnerhalb der Schleife hochgezählt wird und somit die Abbruch-bedingung greift. Auch folgende Schleife würde funktionieren:

C#bool doStatements = true;int i = 1;for (;doStatements;) { Console.WriteLine( i ); i++; doStatements = ( i<= 1000 );}

In diesem Fall wird überhaupt keine Schleifenvariable benutzt,allerdings sehr wohl eine Abbruchbedingung, nämlich doStatements. Sobald diese False wird, wird die Schleife entsprechend abge-brochen und mit den nachfolgenden Anweisungen weitergemacht.In diesem Fall verhält sich die for-Schleife wie eine while-Schleife.

breakAuch in C# gibt es eine Abbruchbedingung für Schleifen, die aller-dings nicht nur für die for-Schleife sondern auch für andereSchleifen und Verzweigungskonstruktionen gilt. Es handelt sichum die Anweisung break. Wenn man diese benutzt, kann man mitHilfe der for-Schleife auch eine Endlosschleife bilden und dieseabhängig von einer Bedingung innerhalb der Schleife abbrechen:

C#int i = 1;for (;;) { Console.WriteLine( i ); i++; if ( i > 1000 ) break;}

ContinueEin weiterer Schleifendurchlauf wird durch die Anweisung Continuegestartet. Auch diese Anweisung gilt für jede Schleife, nicht alleinfür for. Wenn Continue eingesetzt wird, werden die Anweisungen imSchleifenkopf durchlaufen, d.h. es wird sowohl die Laufvariableerhöht (oder erniedrigt) als auch die Abbruchbedingung geprüft:

120 3 C# vs. Visual Basic .NET

C# for ( int i=1; i<=10; i++ ) { if ( (i % 2) == 0 ) continue; Console.WriteLine( i );}

Do-Schleife

Die do-Schleife in C# ist nicht so mächtig wie die von Visual Basic.NET. Während in VB.NET sowohl am Anfang als auch am EndeBedingungen angegeben werden können, begnügt die do-Schleifein C# sich mit der Möglichkeit, am Ende der Schleife einen Aus-druck zu kontrollieren und dementsprechend die Anweisungeninnerhalb der Schleife zu wiederholen oder auch nicht. Damit istdie Do-Schleife in Visual Basic .NET sowohl als abweisende Schlei-fenform als auch als nicht-abweisende Schleifenform verwendbar,die do-Schleife in C# ist immer nicht-abweisend.

Die Syntax der Do-Schleife ist in Visual Basic .NET dementspre-chend umfangreich:

Syntax VB.NET Do { While | Until } <Bedingung> Anweisungen[ Exit Do ] AnweisungenLoop

bzw.

Do Anweisungen[ Exit Do ] AnweisungenLoop { While | Until } <Bedingung>

In C# ist die Syntax wesentlich einfacher:

Syntax C# Do { Anweisungen [ break; ] [ continue; ] Anweisungen} while ( <Bedingung> );

Auch hier (wie bei allen Schleifen) besitzt Visual Basic .NET wie-der ein Exit-Kommando, das in C# der Anweisung break ent-spricht. Ebenfalls möglich ist in C# die Anweisung continue, mitder der nächste Schleifendurchlauf gestartet wird. Die Bedingun-gen werden auch hier wieder kontrolliert.

Programmiertechniken 121

Der Vergleich beider Konstruktionen mittels eines Beispiels ist hiernur bei einer Art des Einsatzes möglich, nämlich als nicht-abwei-sende Schleife. In Visual Basic .NET sieht das dann so aus:

Visual Basic .NETDim i As Integer = 0;Do Console.WriteLine( i ) i = i + 1Loop While i<10

In C# programmiert sieht dies folgendermaßen aus:

C#int i = 0;do { Console.WriteLine( i ); i++;} while ( i<10 );

While-Schleife

Die while-Schleife verhält sich in beiden Sprachen gleich undunterscheidet sich lediglich ein klein wenig in der Syntax. Hier dieSyntax für Visual Basic .NET:

Syntax VB.NETWhile <Bedingung> Anweisungen [ Exit While ] AnweisungenEnd While

Und hier die Syntax für C#:

Syntax C#while ( <Bedingung> ) { Anweisungen [ break; ] [ continue; ] Anweisungen}

Die geschweiften Klammern werden nicht benötigt, wenn es sichlediglich um eine Anweisung handelt, die ausgeführt werden soll.

foreach-Schleife

Die foreach-Schleife dient in beiden Sprachen dazu, über die Werteeiner Collection oder eines Arrays zu iterieren. Die foreach-Schleife empfiehlt sich dann, wenn Sie auf alle Elemente einesArrays nacheinander zugreifen müssen, z.B. zur Ausgabe oderum eine Kontrolle durchzuführen, aber nicht wissen, wie vieleElemente enthalten sind.

122 3 C# vs. Visual Basic .NET

Auch die foreach-Schleife unterscheidet sich lediglich in der Syn-tax. Hier zunächst die Syntax von Visual Basic .NET:

Syntax VB.NET For Each <Element> In <Array> Anweisungen [ Exit For ] Anweisungen Next [ <Element> ]

Die Syntax von C# liest sich ähnlich:

Syntax C# foreach ( <Element> in <Array> ) { Anweisungen [ break; ] [ continue; ] Anweisungen}

Ein Unterschied besteht noch in der Deklaration der Elementvariab-len. C# erlaubt hier wieder wie z.B. auch bei der for-Schleife eineDeklaration im Schleifenkopf, was mit Visual Basic .NET nicht mög-lich ist. Eine Implementation würde z.B. so aussehen:

C# public void WriteAll( string[] sArray ) { foreach ( string s in sArray ) { Console.WriteLine( s ); }}

In Visual Basic .NET müsste hier die Variable s vor der Schleifedeklariert werden:

Visual Basic .NET Public Sub WriteAll(ByVal sArray As String()) Dim s As String

For Each s In sArray Console.WriteLine( s ) NextEnd Sub

3.3.2 Verzweigungen

If-Anweisung

Die If-Anweisung verhält sich in beiden Sprachen gleich undunterscheidet sich auch hier lediglich durch die Syntax. In VisualBasic .NET werden die zu kontrollierenden Bedingungen nachdem Schlüsselwort If angegeben und mit Then beendet, woraufder Anweisungsblock folgt und danach ein abschließendes End If.

Programmiertechniken 123

C# verwendet wieder geschweifte Klammern zur Blockbildung,die zu kontrollierenden Bedingungen werden in runden Klam-mern nach dem Schlüsselwort If angegeben. Hier die Syntax vonVisual Basic .NET:

Syntax VB.NETIf <Bedingung> Then AnweisungenEnd If

Und hier die Syntax von C#:

Syntax C#if ( <Bedingung> ) { Anweisungen}

Die geschweiften Klammern werden nicht benötigt, wenn es sichnur um eine Anweisung handelt, die ausgeführt werden soll.

Select-Anweisung (switch-Anweisung)

Visual Basic .NET implementiert zum Vergleichen eines Werts mitmehreren möglichen Ergebnissen die Select Case-Anweisung,deren Syntax sich folgendermaßen gestaltet:

Syntax VB.NETSelect [ Case ] Ausdruck [ Case Ergebnis 1: [ Anweisungen ] ] [ Case Ergebnis 2: [ Anweisungen ] ]

...

[ Case Else [ Else-Anweisungen ] ]End Select

Ein Beispiel für die Select Case-Anweisung wäre der Vergleicheiner Variablen auf verschiedene mögliche Werte:

Visual Basic .NETPrivate Sub DoSomething(ByVal DoWhat As Integer) Select Case DoWhat Case 1 Console.WriteLine("Wert 1 wurde gewählt") Case 2 Console.WriteLine("Wert 2 wurde gewählt") Case 3 Console.WriteLine("Wert 3 wurde gewählt") Case Else Console.WriteLine("Ein anderer Wert wurde gewählt") End SelectEnd Sub

124 3 C# vs. Visual Basic .NET

In C# existiert für derartige Vergleiche die switch-Anweisung,deren Syntax allerdings ein wenig von der der Select-Case-Anwei-sung abweicht. Die Syntax der switch-Anweisung sieht folgender-maßen aus:

Syntax C# switch (Ausdruck){ case Ergebnis: Anweisungen Sprunganweisung [default: Anweisungen Sprunganweisung]}

Zwischen diesen beiden Anweisungen gibt es einige Unter-schiede. Die mächtigere Variante ist ohne Zweifel die VB.NET-Variante. Grundsätzlich kann sie zwar das Gleiche, allerdingswesentlich einfacher.

Case-Block Einer der größten Unterschiede ist, dass die Anweisungen inner-halb eines Case-Blocks mit einer Sprunganweisung abgeschlossenwerden müssen. Dabei kann es sich sowohl um einen Sprung zueiner anderen Case-Anweisung handeln als auch um einen Sprungaus dem switch-Statement heraus (mittels break).

Weiterhin kann in C# nur immer ein Ergebnis pro Case-Anweisungausgewertet werden. Sollen mehrere Werte zum gleichen Ergebnisführen, kann man die Sprunganweisung einfach weglassen (bzw.alle Anweisungen), wodurch das Programm einfach von einer zurnächsten Case-Anweisung durchfällt, bis Anweisungen gefundenwerden und auch die obligatorische Sprunganweisung.

MehrereAuswertungen

In Visual Basic .NET ist es möglich, mehrere Ergebniswerte inner-halb einer Case-Anweisung auszuwerten. Die einfachste Möglich-keit ist dabei, die gewünschten Werte einfach durch Kommata zutrennen. Das folgende Beispiel in Visual Basic .NET und C# führtzum gleichen Ergebnis und zeigt den Unterschied auf:

Visual Basic .NET Private Sub DoSomething(ByVal DoWhat As Integer) Select Case DoWhat Case 1, 2, 3 Console.WriteLine("Wert ist kleiner als 4") Case 4 Console.WriteLine("Wert ist gleich 4") Case 5, 6, 7, 8 Console.WriteLine("Wert ist größer 4") Case Else

Programmiertechniken 125

Console.WriteLine("Wert ist größer 8") End SelectEnd Sub

Umgesetzt in C# ist hier etwas mehr Schreibarbeit erforderlich:

C#private void DoSomething(int doWhat) { switch ( doWhat ) { case 1: case 2: case 3: Console.WriteLine("Wert ist kleiner 4"); break; case 4: Console.WriteLine("Wert ist gleich 4"); break; case 5: case 6: case 7: case 8: Console.WriteLine("Wert ist größer 4"); break; default: Console.WriteLine("Wert ist größer 8"); break; }}

Die Funktion ist dabei genau die gleiche. In Visual Basic .NETkönnte die Anweisung auch folgendermaßen geschrieben werden(wieder mit dem gleichen Ergebnis):

Visual Basic .NETPrivate Sub DoSomething(ByVal DoWhat As Integer) Select Case DoWhat Case 1 To 3 Console.WriteLine("Wert ist kleiner als 4") Case 4 Console.WriteLine("Wert ist gleich 4") Case 5 To 8 Console.WriteLine("Wert ist größer 4") Case Else Console.WriteLine("Wert ist größer 8") End SelectEnd Sub

To und IsÜber das Schlüsselwort To wird angegeben, dass alle Werte gültigsind, die zwischen den beiden angegebenen Werten liegen. Dasvereinfacht die Programmierung der Select Case-Anweisung ineinigen Fällen enorm. Eine weitere Möglichkeit bietet die Anwei-sung Is in Verbindung mit einem Vergleichsoperator. Beachten Sie,dass Is innerhalb einer Select Case-Anweisung eine andere Bedeu-

126 3 C# vs. Visual Basic .NET

tung besitzt als der gleichnamige Vergleichsoperator. Die folgendeAnweisung verwendet den Is-Operator:

Visual Basic .NET Private Sub DoSomething(ByVal DoWhat As Integer) Select Case DoWhat Case 1 To 3 Console.WriteLine("Wert ist kleiner als 4") Case 4 Console.WriteLine("Wert ist gleich 4") Case 5 To 8 Console.WriteLine("Wert ist größer 4") Case Is > 8 Console.WriteLine("Wert ist größer als 8") Case Else Console.WriteLine("Wert ist kleiner 1") End SelectEnd Sub

Zuletzt ist es auch noch möglich, die verschiedenen Möglichkeiteninnerhalb eines Case-Statements zusammenzufassen (also gemein-sam zu benutzen). Das würde dann in etwa so aussehen:

Visual Basic .NET Select Case DoWhat Case 1, 2, 3 To 7, 9, Is > 15 Console.WriteLine("Ein Wert ... ") Case 8, 10 To 15 Console.WriteLine("Ein anderer Wert ...")End Select

3.3.3 Casting

Als Casting bezeichnet man die explizite (erzwungene) Umwand-lung eines Datentyps in einen anderen. Casting wird dann benö-tigt, wenn z.B. ein numerischer Datentyp mit großer Bit-Breite(z.B. der Datentyp System.Int64) in einen ebenfalls numerischenDatentyp kleinerer Bit-Breite (z.B. System.Int32) konvertiert wer-den soll. Der Grund für die Notwendigkeit, diese Umwandlungzu erzwingen, ist, dass Daten verloren gehen können.

Standardmäßig zeigt Visual Basic .NET hier keinen Fehler an, da dieKonvertierung eines großen Datentyps in einen kleinen mittels OptionStrict auf »Off« erlaubt ist. Wenn Sie in den Projektoptionen OptionStrict auf »On« stellen, sehen Sie auch, dass Visual Studio .NET einenFehler anzeigt, wenn eine explizite Konvertierung erforderlich ist.

In Visual Basic .NET wird dieses Casting durch die AnweisungenCInt, CDbl, CStr usw. durchgeführt, allgemein kann auch CType ver-

t

Programmiertechniken 127

wendet werden, mit dem in einen beliebigen Datentyp gecastetwerden kann.

Casting in C#In C# wird ein anderes Konzept verfolgt: Hier wird der Datentyp,in den umgewandelt werden soll, einfach in Klammern vor denDatentyp geschrieben, der den Wert enthält. Zum Vergleich wie-der ein kleines Codefragment zunächst in Visual Basic .NET:

Visual Basic .NET(***)

Dim long1 As Long = 5000Dim int1 As Integer

int1 = CInt(long1)

Und nun die C#-Variante:

C#long long1 = 5000;

int i = (int)long1;

3.3.4 With-Anweisung

WithDie With-Anweisung ist eine nützliche Vereinfachung für den Pro-grammierer. Wenn Sie auf Elemente eines Objekts zugreifen wol-len, müssen Sie dieses Element normalerweise qualifizieren, d.h.den Namen des Objekts mit angeben. Die With-Anweisung ermög-licht es, den Namen des Objekts nur einmal angeben zu müssenund die Elemente innerhalb der With-Anweisung einfach zu benut-zen. Die Qualifikation der Elemente erfolgt dann mittels einesPunkts.

Visual Basic .NETWith Button1 .Width = 150 .Height = 120 .Left = 100 .Top = 100 .BackColor = Color.AliceBlueEnd With

Die With-Anweisung existiert leider nur in Visual Basic .NET, in C#ist es grundsätzlich notwendig, die vollständige Bezeichnunganzugeben. Das ist wirklich ein Manko von C#.

In der Beta 1 des Visual Studio .NET war die with-Anweisung in der Tatauch in C# implementiert. Leider wurde dieses nützliche Statement ausunerfindlichen Gründen wieder aus der Sprachdefinition entfernt; injedem Fall wäre es eine sinnvolle Erweiterung in der nächsten Version.

t

128 3 C# vs. Visual Basic .NET

3.3.5 Arrays

Eindimensionale Arrays

Deklaration inVB.NET

Grundsätzlich haben Arrays in beiden Sprachen die gleicheBedeutung. Allerdings verhalten sie sich – was die Deklarationund die Initialisierung angeht – ein wenig unterschiedlich. Beidengemein ist, dass das erste Element eines Arrays den Index 0 hat.Bei der Deklaration allerdings wird in C# die Anzahl der enthalte-nen Elemente angegeben, in Visual Basic .NET der Index des letz-ten Elements. Damit liefert die Deklaration

Dim myArray(6) As Integer

ein Array mit sieben Elementen, nämlich von 0 bis 6. Die Deklara-tion

Dim myArray() As Integer = New Integer(6) {}

tut das Gleiche unter Verwendung des New-Operators. Wenn dieserverwendet werden soll, darf allerdings vorher keine Größe ange-geben worden sein. Weiterhin dürfen Sie nicht die geschweiftenKlammern am Ende der Zeile vergessen, die auch dann benötigtwerden, wenn das Array nicht gleich mit Werten vorbelegt wird.

Die Verwendung von New hat den Vorteil, dass die im Array enthal-tenen Werte direkt initialisiert werden (in diesem Fall mit 0),wogegen die Größenangabe im ersten Beispiel es erforderlichmacht, dass später den einzelnen Elementen auch Werte zugewie-sen werden, bevor man das Array benutzt (also Werte ausliest).

Deklaration in C# In C# läuft die Deklaration ein wenig anders ab. Hier wird grund-sätzlich mit dem new-Operator gearbeitet. Die Deklaration des glei-chen Arrays würde also in C# folgendermaßen aussehen:

C# int[] myArray = new int[7];

Beachten Sie den Unterschied: in C# Angabe der Anzahl der Ele-mente, in Visual Basic .NET Angabe des höchsten Indexes. Dasführt sehr oft zu Fehlern bei der Umstellung, vor allem wenn einProgramm von Visual Basic .NET auf C# umgestellt werden soll –in diesem Fall hätte das Array in C# nämlich einen Eintrag zuwenig.

Vorbelegung mitWerten

Arrays können bereits bei der Deklaration mit Werten vorbelegtwerden. Das geschieht in beiden Sprachen durch Angabe derWerte in geschweiften Klammern nach der Deklaration:

Programmiertechniken 129

Visual Basic .NET(***)

Dim myArray() As Integer = New Integer(2) {1, 2, 3}

oder in C#

C#int[] myArray = new int[3] {1, 2, 3};

In C# ist auch noch eine Abkürzung möglich, indem man dieDeklaration mit new weglässt. In beiden Fällen ist es nicht notwen-dig, eine Größe anzugeben, da diese bereits durch die hinter derDeklaration angegebenen Werte bestimmt wird. Wird aber (imFalle von Visual Basic .NET) eine Größenangabe gemacht, mussdiese mit der Anzahl der angegebenen Einträge übereinstimmen.Obiges Array könnte also auch so deklariert werden:

Visual Basic .NETDim myArray() As Integer = New Integer() {1, 2, 3}

oder in C#:

C#int[] myArray = {1, 2, 3};

Mehrdimensionale Arrays

DeklarationDie Deklaration mehrdimensionaler Arrays gestaltet sich bis aufden Unterschied in der Syntax in beiden Sprachen gleich. Einzweidimensionales Array würde in Visual Basic .NET folgender-maßen deklariert:

Visual Basic .NETDim myArray(,) As Integer = New Integer(,) {}

und in C# folgendermaßen:

C#int[,] myArray = new int[,];

Vorbelegung mit Werten

Auch hier ist es möglich, sowohl die Größe gleich anzugeben bzw.das Array gleich vorzubelegen. Dabei müssen die Elemente in bei-den Sprachen in geschweiften Klammern geschachtelt werden:

C#int[,] myArray2 = new int[,] {{1,2},{1,3}};

oder in Visual Basic .NET:

Visual Basic .NETDim myArray(,) As Integer = New Integer(,) _{{1,2},{1,3}}

Jagged Arrays

Auch für jagged Arrays, also Arrays innerhalb von Arrays, geltenin beiden Sprachen die gleichen Voraussetzungen, wieder mit dergeänderten Syntax.

130 3 C# vs. Visual Basic .NET

Redimensionierung

In Visual Basic .NET ist es möglich, Arrays zu redimensionieren,ohne die enthaltenen Werte zu verlieren. Das geschieht durch dieAnweisung ReDim Preserve. In C# ist das nicht möglich, hier müs-sen Sie, wenn Sie ein Array vergrößern wollen, zunächst die ent-haltenen Werte irgendwohin kopieren und dann die Größe desArrays durch eine neue New-Anweisung ändern.

Ein großer Nachteil von ReDim Preserve ist allerdings die Geschwin-digkeit, denn diese Anweisung ist recht langsam. Falls Sie dyna-mische Arrays benötigen, sollten Sie die Klasse System.

Collections.ArrayList verwenden, die speziell für diesen Zweckim .NET Framework enthalten ist.

3.4 Unterschiede in der Entwicklungsumgebung

Codevervoll-ständigung

Zwar ist Visual Studio .NET die Entwicklungsumgebung sowohlfür Visual Basic .NET als auch für C#, doch gibt es für jede Spracheeinen Editor. Diese Editoren weisen beachtliche Unterschiede auf.

Bei der Arbeit mit Visual Basic .NET merkt man gleich, dass derEditor sehr viel Hilfestellung gibt. Die automatische Vervollstän-digung arbeitet nicht nur bei Sub- und Function-Konstruktionen,sondern auch bei Schleifen und anderen Blockkonstrukten. Außer-dem wird der Inhalt eines Codeblocks automatisch eingezogenund korrekt positioniert.

Der C#-Editor hilft an dieser Stelle nicht so sehr mit. Geschriebe-ner Code bleibt an der Stelle, an der Sie ihn geschrieben haben,und auch die schließende geschweifte Klammer wird nicht auto-matisch gesetzt. Sie haben jedoch auch hier die Möglichkeit, Code-zeilen automatisch an die richtige Stelle zu setzen. Wenn Sie eineCodezeile in einen Block eingefügt haben, dann die schließendegeschweifte Klammer entfernen und nochmals setzen, wird auchin C# der Codeblock korrekt positioniert.

Während der VB.NET-Editor vergessene runde Klammern beimAufruf oder bei der Deklaration einer Methode vervollständigt,erzeugt Visual Studio .NET für C#-Code in diesem Fall dafür lie-ber drei Fehlermeldungen. Man könnte daher sagen, C# machtmehr Mühe.

Unterschiede in der Entwicklungsumgebung 131

List MembersDie Entwicklungsumgebung bietet für deklarierte und typisierteVariablen beim Kodieren eine Liste aller verfügbaren Methodenund Attribute an (Funktion MEMBER AUFLISTEN). Da C# eine Spra-che ist, die zwischen Groß- und Kleinschreibung unterscheidet,versagt der Code-Editor logischerweise sofort seine Mithilfe, wenndie Schreibweise nicht stimmt (während sie in Visual Basic .NETeinfach angepasst wird). Das ist damit zu begründen, dass es in C#ebenso gut eine Variable mit der gegebenen Schreibweise gebenkönnte. Es ist also teilweise etwas störend, hat seinen Ursprungaber in der Unterscheidung der Groß- und Kleinschreibung.

Ein Trick besteht darin, die Funktion MEMBER AUFLISTEN über dasKontextmenü oder die Tasten (STRG)+(J) manuell aufzurufen, wäh-rend der Cursor auf einem Wort steht, dessen Schreibweise offen-sichtlich nicht stimmt. Voraussetzung dafür, dass MEMBER AUFLISTEN

funktioniert, ist aber in jedem Fall die Einbindung der entsprechen-den Komponente als Referenz in das Projekt. Visual Studio .NETnutzt dann die .NET-Meta-Daten bzw. eine COM-Typbibliothek zurErmittlung der verfügbaren Klassen und Klassenmitglieder.

Regions

In allen Code-Editoren kann der Entwickler die Implementierungvon einzelnen Klassen und Unterroutinen durch die Zeichen +und – ähnlich wie bei den Verzeichnissen im Windows Explorerverbergen. Es bleibt dann nur der Klassen- bzw. Unterroutinen-Rumpf stehen mit einem Verweis, dass die Implementierung ver-borgen ist. Mit der Compiler-Direktive #Region...#Endregion kannder Entwickler auch eigene zuklappbare Code-Abschnitte definie-ren. Bei diesen Regions gibt es auch Unterschiede. Für C# gilt,dass Sie die Bezeichnung direkt hinter das Wort Region schreibenkönnen, Visual Basic .NET erfordert es, die Bezeichnung in Anfüh-rungszeichen zu setzen.

Kompilieren im Hintergrund

Der Code-Editor prüft bereits beim Verlassen einer Codezeile dieseauf Syntax- und Typfehler. Eine geschlängelte Linie weist Sie aufeinen Fehler hin, wenn Sie die Maus darüber ziehen, wird der Feh-ler auch im Klartext angezeigt. Parallel dazu erzeugt Visual Studio.NET einen Eintrag im »Task-Window«, in dem die Compiler auchdie Kompilierungsfehler melden. Der Entwickler wird nicht mehrwie bei der automatischen Syntaxprüfung in Visual Basic 6.0 durch

132 3 C# vs. Visual Basic .NET

Dialogboxen gestört. Zudem bemerkt Visual Studio .NET wesent-lich mehr Fehler, z.B. dass eine Variable oder eine verwendeteUnterroutine undeklariert ist. Aber auch hier ist der Visual Basic.NET-Editor besser als der C#-Editor: Die Hintergrundkompilie-rung erkennt hier eine hinsichtlich des Datentyps fehlerhafteZuweisung sofort nach dem Verlassen der Zeile. Der C#-Editorbemerkt den Typfehler bzw. die Verbesserung eines Typfehlers erstbeim Kompilieren.

Zugriff auf die Namespaces

Globale Name-space-Einbindung

Um einen Typ in seiner Kurzschreibweise (also ohne den komplet-ten Namespace) verwenden zu können, ist ein Import des Name-spaces notwendig. Der Import erfolgt in C# mit using und in VisualBasic .NET mit Imports. Während in C# alle Namespaces in jedereinzelnen Quellcodedatei explizit mit using eingebunden werdenmüssen, ermöglicht es Visual Studio .NET für VB.NET-Projekte, inden Projekteigenschaften Imports-Anweisungen festzulegen, diefür alle Quellcodedateien in dem Projekt gelten. Den entsprechen-den Dialog finden Sie durch einen Klick auf den PROJEKTOPTIONEN-Button im Eigenschaftsfenster oder über das Kontextmenü des Pro-jekts (Auswahl EIGENSCHAFTEN). In diesem Dialog können Sie nundie zu importierenden Namespaces festlegen.

Automatische Formatierung

Quelltext-Formatierung

Die Quelltext-Formatierung ist in Visual Basic .NET wesentlichausgeprägter als in C#. Das hat mehrere Gründe, unter anderemweil Visual Basic .NET nicht zwischen Groß- und Kleinschreibungunterscheidet und sich so Schreibweisen z.B. von Namespaceseinfach heraussucht und sie so schreibt, wie sie ursprünglichdeklariert wurden. Das gilt auch für Variablen, die ebenfallsgrundsätzlich so formatiert werden, wie sie bei der Deklarationgeschrieben wurden.

Die Programmierung mit Visual Basic .NET gestaltet sich dadurchfür den einen oder anderen wesentlich schneller, weil man einfachdrauflos schreiben kann. In C# ist das nicht möglich. Allerdingshat C# den Vorteil, dass die Formatierung zu einem gewissenGrad auch dem Programmierer überlassen wird. Ob die bessereIntelliSense-Hilfe ein Grund ist, auf C# als Sprache zu verzichtenund stattdessen doch Visual Basic .NET zu benutzen, bleibt dieEntscheidung jedes einzelnen.