Der Übergang von Visual Basic 6.0 zu Visual Basic.NET

Veröffentlicht: 31. Mrz 2001 | Aktualisiert: 16. Jun 2004

Microsoft Visual Basic.NET ist die nächste Version von Microsoft Visual Basic©, die mit dem .NET Framework völlig umgestaltet wurde, um Ihnen das einfache Erstellen von Anwendungen für die nächste Generation des Betriebssystems Microsoft Windows© und des Internets zu ermöglichen. Mit Visual Basic.NET ist die visuelle Entwicklung von Webanwendungen, Webdiensten, Windows-Anwendungen und serverseitigen Komponenten ein Kinderspiel. Darüber hinaus bietet Visual Basic.NET die XCOPY-Bereitstellung von Windows-Anwendungen. Sie müssen also nicht mehr über Probleme mit DLL-Versionen grübeln. Visual Basic.NET macht die gefürchtete "DLL Hell" zu einem Ding der Vergangenheit.

Auf dieser Seite

 Sprache
 Währung 
 Datum 
 Zeichenfolgen fester Länge 
 Typ 
 Speicherung benutzerdefinierter Typen 
 True 
 Empty
 NULL und NULL-Verteilung 
 Def<Type> 
 Lokale Variablen innerhalb von Blöcken 
 Neue AutoReinstantiierung 
 Objektbeendigung ("Finalize") 
 Arrays
 ReDim
 Zuweisung 
 And, Or, Xor und Not 
 Rangfolge von Operatoren 
 Aufrufen von Prozeduren 
 Statische Prozeduren 
 Parameterstandard "ByVal/ByRef"
 "IsMissing" und Optionale Parameter 
 "ParamArray"-Parameter 
 "As Any"-Parameter in Deklarationen 
 Implements 
 "Property"-Funktionen 
 Standardeigenschaften
 Enumerationen
 While
 On.GoTo und On.GoSub 
 GoSub.Return 
 LSet
 VarPtr, StrPtr und ObjPtr 

Beim Entwurf von Visual Basic.NET haben wir uns an den primären Anforderungen von Visual Basic-Entwicklern weltweit orientiert. Die Visual Basic-Sprache ist jetzt wirklich objektorientiert und unterstützt die Vererbung von Implementierungen. Der Formular-Designer unterstützt die visuelle Vererbung und enthält neue Features, z.B. die automatische Anpassung von Formularen, Ressourcenlokalisierung und Eingabehilfen. Die Datentools unterstützen jetzt generell XML-Daten, und die Entwurfszeit-Datenbindung funktioniert nun auch mit getrennten Daten. Darüber hinaus setzt Visual Basic.NET direkt auf dem .NET Framework auf, so dass Sie vollständigen Zugriff auf alle Plattformfeatures und Interoperabilität mit anderen .NET-Sprachen haben.

Damit Sie diese Features im neuen Produkt vorfinden, haben wir mehrere Bereiche des Produkts grundlegend verändert. In diesem Dokument werden einige der Änderungen von Visual Basic 6.0 in Visual Basic.NET erläutert, und es wird beschrieben, welche Motivation uns dazu bewegte, diese Änderungen vorzunehmen. Außerdem werden die Funktionen des Visual Basic.NET-Aktualisierungs-Assistenten beschrieben, eines Tools, das zum Lieferumfang von Visual Basic.NET gehört und mit dem Sie Ihre vorhandenen Anwendungen auf Visual Basic.NET aktualisieren können.

Sprache

Variant

Visual
Basic 6.0

Variant ist ein spezieller "universeller" Datentyp, der alle Arten von Daten mit Ausnahme von Zeichenfolgen fester Länge enthalten kann. Eine Object-Variable wird als Zeiger auf ein Objekt verwendet. Variant ist der standardmäßige Datentyp.

Visual Basic.NET

Die Common Language Runtime (CLR) verwendet Object als universellen Datentyp. In Visual Basic.NET hätte auch weiterhin Variant als universeller Datentyp verwendet werden können, aber wir haben uns entschieden, die Benennungskonvention der CLR anzunehmen, um Verwirrungen bei der sprachübergreifenden Entwicklung vorzubeugen. Das Typensystem wurde vereinfacht, indem nur ein einziger universeller Datentyp verwendet wird. Der standardmäßige Datentyp ist Object.

Aktualisierungs-
Assistent

Variant-Datentypen werden in Object konvertiert. Die Codeanweisung:

Dim x As Variant

wird aktualisiert auf:

Dim x As Object

Integer und Long

Visual
Basic 6.0

Long-Variablen werden als 32-Bit-Zahlen mit Vorzeichen und Integer-Variablen als 16-Bit-Zahlen gespeichert.

Visual Basic.NET

Long-Variablen werden als 64-Bit-Zahlen mit Vorzeichen, Integer-Variablen als 32-Bit-Zahlen und Short-Variablen als 16-Bit-Zahlen gespeichert. Auf 32-Bit-Systemen sind 32-Bit-Ganzzahloperationen schneller als 16-Bit- bzw. 64-Bit-Ganzzahloperationen. Das heißt, dass Integer der effizienteste und fundamentalste numerische Datentyp ist.
Da einige der .NET Framework-Technologien auf modernen 32-Bit- und 64-Bit-Technologien basieren, macht es Sinn, die Datengrößen auf die neue Technologie zu aktualisieren.

Aktualisierungs-
Assistent

Die Variablentypen werden geändert. Die Codeanweisung:

Dim x As IntegerDim y As Long

wird aktualisiert auf:

Dim x As ShortDim y As Integer

 

Währung 

Visual
Basic 6.0

Visual Basic 6.0 unterstützt einen Currency-Datentyp. Sie können eine Variable nicht als Decimal deklarieren (obwohl Variant-Datentypen den Untertyp Decimal haben können).
Currency-Variablen werden als 64-Bit-Zahlen im Ganzzahlformat, skaliert um den Faktor 10.000, gespeichert. Sie erhalten eine Festpunktzahl mit 15 Stellen links von der Dezimalstelle und 4 Stellen rechts davon. Diese Darstellung erlaubt einen Bereich von -922.337.203.685.477,5808 bis 922.337.203.685.477,5807.
Decimal-Variablen werden als 96-Bit-Ganzzahlen mit Vorzeichen, die um die Variablenpotenz 10 skaliert werden, gespeichert. Der Skalierungsfaktor "Potenz 10" legt die Anzahl an Stellen rechts vom Dezimalpunkt fest und hat einen Bereich von 0 bis 28. Bei der Skalierung 0 (keine Dezimalstellen) ist der größtmögliche Wert +/-79.228.162.514.264.337.593.543.950.335. Mit 28 Dezimalstellen ist der größte Wert +/-7,9228162514264337593543950335 und der kleinste Nichtnullwert +/-0,0000000000000000000000000001.

Visual Basic.NET

Der Currency-Datentyp verfügt nicht über die ausreichende Genauigkeit, um Rundungsfehler zu vermeiden; Decimal wurde deshalb als eigener Datentyp erstellt.

Aktualisierungs-
Assistent

Currency-Datentypen werden in Decimal konvertiert. Die Codeanweisung:

Dim x As Currency

wird aktualisiert auf:

Dim x As Decimal

 

Datum 

Visual
Basic 6.0

Eine Date-Variable wird intern im Double-Format gespeichert und kann als Double bearbeitet werden.
Date-Variablen werden als IEEE 64-Bit-Gleitkommazahlen gespeichert, die Daten im Bereich 1. Januar 100 bis 31. Dezember 9999 und Uhrzeiten zwischen 0:00:00 und 23:59:59 darstellen. Alle erkennungsfähigen Literaldatenwerte können Date-Variablen zugewiesen werden.
Wenn andere numerische Typen in Date konvertiert werden, stellen die Werte links vom Dezimalzeichen Datumsinformationen dar, während die Werte rechts vom Dezimalzeichen Uhrzeitinformationen darstellen. Mitternacht entspricht 0 und 12 Uhr mittags 0,5. Negative ganze Zahlen stellen Daten vor dem 30. Dezember 1899 dar.

Visual Basic.NET

Date-Variablen werden intern als 64-Bit-Ganzzahlen gespeichert, so dass sie nicht direkt als Double bearbeitet werden können. Das .NET Framework enthält die Funktionen ToOADate und FromOADate, um zwischen Double und Date zu konvertieren. Die Darstellung von Daten als Ganzzahlen vereinfacht und beschleunigt die Bearbeitung von Daten.

Aktualisierungs-
Assistent

Obwohl nicht alle Fälle erkannt werden können, in denen ein Variant-Datentyp zum Speichern eines Date als Double verwendet wird, fügt das Aktualisierungstool i.d.R. die entsprechende ToOADate- bzw. FromOADate-Methode dort ein, wo ein Double einem Date zugewiesen wird. Die folgende Codeanweisung:

Dim dbl As Double  Dim dat As Date  Dbl = dat

wird aktualisiert auf:

Dim dbl As Double  Dim dat As Date  Dbl = dat.ToOADate

 

Zeichenfolgen fester Länge 

Visual
Basic 6.0

Variablen können mit einer Zeichenfolge fester Länge deklariert werden (Ausnahme: Public-Variablen in einem Klassenmodul).

Visual Basic.NET

Zeichenfolgen fester Länge werden in der ersten Version der CLR nicht unterstützt. Diese Unterstützung wird in einer späteren Version hinzugefügt.

Aktualisierungs-
Assistent

In den meisten Fällen ist dies kein Problem. Der Assistent bietet ein Verhalten für Zeichenfolgen fester Länge. Die Codeanweisung:

Dim MyFixedLengthString As String * 100

wird aktualisiert auf:

Dim MyFixedLengthString As New VB6.FixedLengthString(100)

Weitere Informationen zu diesem Thema finden Sie in dem Whitepaper Vorbereiten von Visual Basic 6.0-Anwendungen für das Update auf Visual Basic.NET

 

Typ 

Visual
Basic 6.0

Die Type-Anweisung wird verwendet, um einen benutzerdefinierten Datentyp zu definieren.

Visual Basic.NET

Die Namen Typ und Benutzerdefinierter Typ sind verwirrend, da Klassen, Enumerationen und Schnittstellen ebenfalls Typen sind, die von Benutzern definiert werden können. Typ und Benutzerdefinierter Typ sind Rudimente aus QuickBasic. Darin waren Strukturen und Datensätze die einzigen Datentypen, die vom Benutzer definiert werden konnten. Das CLR-Typensystem verwendet den Namen Type in weiterem Sinne und bezeichnet damit alle Datentypen.
Aus diesem Grund wurde die Type-Anweisung in Visual Basic.NET in Structure geändert.

Aktualisierungs-
Assistent

Type-Anweisungen werden in Structure-Anweisungen konvertiert. Die Codeanweisung:

Type MyType  MyVariable As Integer  End Type

wird aktualisiert auf:

Structure MyType  Dim MyVariable As Short  End Structure

 

Speicherung benutzerdefinierter Typen 

Visual
Basic 6.0

Benutzerdefinierte Datentypen können ein oder mehrere Elemente eines Datentyps, eines Arrays oder eines zuvor definierten benutzerdefinierten Typs enthalten. In Visual Basic 6.0 werden benutzerdefinierte Datentypen in zusammenhängenden Blöcken gespeichert.

Visual Basic.NET

Das Visual Basic.NET-Format ist in seiner Effizienz unübertroffen. Der Speicher kann ein zusammenhängender Speicherblock sein, muss es aber nicht. Strukturen können mit Marshallingattributen gekennzeichnet werden, um sicherzustellen, dass sie an die COM-Komponenten als zusammenhängender Speicherblock übergeben werden.

Aktualisierungs-
Assistent

APIs erhalten einen ZUERLEDIGEN-Kommentar an allen Stellen, wo Sie Marshallingattribute hinzufügen müssen (Attribute werden nicht automatisch hinzugefügt; sie werden nicht benötigt, es sei denn Sie übergeben die Strukturen an die APIs).

 

True 

Visual
Basic 6.0

True hat den Wert -1.

Visual Basic.NET

True hat den Wert 1.
Aus Gründen der Spracheninteroperabilität wird eine konsistente Darstellung sprachübergreifend benötigt.

Aktualisierungs-
Assistent

Wenn aus einem Boolean-Typ ein nicht boolescher Typ erzwungen wird, kennzeichnet der Assistent den Code mit einer Aktualisierungswarnung in Kommentarform. Die folgende Codeanweisung:

Dim MyBoolean As Boolean  Dim MyInteger As Integer  MyInteger = MyBoolean

wird aktualisiert auf:

Dim MyBoolean As Boolean  Dim MyInteger As Short  ' UPGRADE_WARNING: Boolean MyBoolean is being converted into a numeric  MyInteger = MyBoolean

 

Empty

Visual
Basic 6.0

Variant-Datentypen werden in Empty initialisiert, das entweder a) bei Verwendung in einem numerischen Ausdruck automatisch in Null konvertiert wird oder b) bei Verwendung in einem Zeichenfolgenausdruck in eine leere Zeichenfolge konvertiert wird.

Visual Basic.NET

Object-Variablen werden in Nothing initialisiert, das entweder a) bei Verwendung in einem numerischen Ausdruck automatisch in Null konvertiert wird oder b) bei Verwendung in einem Zeichenfolgenausdruck in eine leere Zeichenfolge konvertiert wird. Durch die Verwendung von Nothing anstelle eines speziellen Empty-Wertes wird die Komplexität in der Sprache reduziert und eine verbesserte Spracheninteroperabilität ermöglicht.

Aktualisierungs-
Assistent

 

NULL und NULL-Verteilung 

Visual
Basic 6.0

Null-Werte sind Variant-Untertypen, die anzeigen, dass eine Variable keine gültigen Daten enthält. Null-Werte werden durch Ausdrücke und Funktionen "verteilt". Wenn ein Teil eines Ausdrucks in Null ausgewertet wird, ist das Ergebnis des gesamten Ausdrucks Null. Die Übergabe von Null als Argument führt bei den meisten Funktionen zur Rückgabe von Null.

Visual Basic.NET

NULL-Verteilungen werden nicht unterstützt. Beim Programmieren von Daten mit ADO.NET werden Felder explizit auf Null getestet, bevor deren Werte abgerufen werden. Variant-Datentypen, die Null enthalten, werden in das CLR als Objekte vom Typ DBNull gemarshallt.
In Visual Basic.NET ist die Null-Regel intuitiver - Zeichenfolgenfunktionen wie Left() geben immer eine Zeichenfolge zurück, so wie Sie es erwarten würden.

Aktualisierungs-
Assistent

Null-Werte und IsNull-Funktionen werden mit einer Aktualisierungswarnung in Kommentarform versehen. Die folgende Codeanweisung:

If x Is Null Then MsgBox "Null"

wird aktualisiert auf:

' UPGRADE_WARNING: Use of IsNull() detected  If IsDBNull(x) Then MsgBox "Null"

 

Def<Type> 

Visual
Basic 6.0

Die Anweisungen DefBool, DefByte, DefInt, DefLng, DefCur, DefSng, DefDbl, DefDec, DefDate, DefStr, DefObj und DefVar werden auf Modulebene verwendet, um den standardmäßigen Datentyp für Variablen, Parameter und Prozedurrückgabetypen einzustellen, deren Namen mit den angegebenen Zeichen beginnen.

Visual Basic.NET

Die Lesbarkeit und Stabilität des Codes wird verbessert, indem implizite Typdeklarationen vermieden werden.

Aktualisierungs-
Assistent

Explizite Deklarationen der Variablentypen werden in den Code eingefügt. Die folgende Codeanweisung:

DefStr a-z  Sub MySub  s = "Hallo"  End Sub

wird aktualisiert auf:

Sub MySub  Dim s As String  s = "Hallo"  End Sub

 

Lokale Variablen innerhalb von Blöcken 

Visual
Basic 6.0

Lokale Variablen sind ab der Zeile, die die Deklaration enthält, bis zum Ende der Prozedur sichtbar.

Visual Basic.NET

Visual Basic.NET unterstützt die Bereichsfestlegung von Variablen pro Block. Das heißt, dass eine lokale Variable ab der Zeile, die die Deklaration enthält, bis zum Ende des Blocks sichtbar ist, in dem die Deklaration erscheint. Beispiel:

Sub Test(x As Integer)If x < 0 Then  Dim y As Integer = - x  '...  Else  '...  End IfEnd Sub

Die Variable y im Beispiel oben ist nur innerhalb des Blocks verfügbar, in dem sie deklariert wurde; d.h., sie ist nur ab der Deklaration bis zur Else-Anweisung verfügbar. Wenn die Variable in der gesamten Prozedur zur Verfügung stehen muss, müssen Sie sie außerhalb der If/Else/EndIf-Steuerprozedur deklarieren.
Die Blockbereichsfestlegung für Variablen ist ein Feature, das in vielen strukturierten Sprachen zu finden ist. Genauso wie lokale Prozedurvariablen das strukturierte Programmieren durch die Definition von Variablen zulassen, die für die Prozeduren privat sind, unterstützen Variablen auf Blockebene das strukturierte Zerlegen von Code, indem sie die Definition von Variablen ermöglichen, die für einen Codeblock privat sind.

Aktualisierungs-
Assistent

Wenn Variablen innerhalb eines Blocks deklariert werden, verschiebt sich ihr Bereich automatisch in die Modulebene. Die folgende Codeanweisung:

If x =1 Then    Dim y As Integer  End If

wird aktualisiert auf:

Dim y As Integer  If x =1 Then  End If

 

Neue AutoReinstantiierung 

Visual
Basic 6.0

Eine Klassenvariablendeklaration im Format Dim x As New <klassenname> führt dazu, dass der Compiler Code für jeden Verweis auf x erzeugt. Dieser Code prüft, ob x gleich Nothing ist. Wenn ja, wird eine neue Instanz der Klasse erstellt. Die folgende Codeanweisung:

im x As New MyClass  '...  Call x.MyMethod()

ist äquivalent zu:

Dim x As MyClass  '...  If x Is Nothing Then    Set x = New MyClass  End If  Call x.MyMethod()

Visual Basic.NET

Eine Variablendeklaration im Format Dim x As New <klassenname> ist äquivalent zu: Dim x As <klassenname> = New <klassenname>. Für Verweise auf Variablen, die mit dieser Syntax deklariert werden, wird kein spezieller Code erzeugt.
Visual Basic.NET-Deklarationen für As New sind wesentlich effizienter als dieselben Deklarationen in Visual Basic 6.0. Für die meisten Verweise auf solche Variablen ist der zusätzliche Overhead unnötig. Auch das Verhalten der "automatischen Instantiierung" von Visual Basic 6.0 ist für viele Programmierer überraschend, wenn sie darauf stoßen.

Aktualisierungs-
Assistent

Nur selten ist dies ein Problem. Wenn eine Codeanweisung allerdings versucht, eine Klasse zu verwenden, nachdem diese auf Nothing gesetzt wurde, ruft sie eine leicht erkennbare Laufzeitausnahme hervor. Die Codeanweisung kann dann bequem geändert werden, indem eine neue Version der Klasse instantiiert wird, wie im folgenden Beispiel:

Dim x As New MyClass  x = Nothing  x = New MyClass

 

Objektbeendigung ("Finalize") 

Visual
Basic 6.0

Der Verweiszähler von COM wird verwendet, um Objektinstanzen in eine Garbagecollection aufzunehmen. Wenn die Objekte sich nicht in Schleifen befinden, erkennt die Verweiszählung unmittelbar, wenn ein Objekt nicht mehr verwendet wird, und führt den Beendigungscode dieses Objekts aus.

Visual Basic.NET

Ein Ablaufverfolgungs-Garbagecollector überwacht die Objekte der Reihe nach; er beginnt mit den erreichbaren Verweisen, die in Stackvariablen, Modulvariablen und gemeinsam genutzten Variablen gespeichert sind. Diese Ablaufverfolgung wird im Hintergrund ausgeführt. Infolgedessen kann ein undefinierter Zeitraum zwischen dem Bereinigen des letzten Verweises auf ein Objekt und dem Hinzufügen eines neuen Verweises verstreichen.
In einigen Fällen müssen Clients über einen Mechanismus verfügen, die Freigabe von Ressourcen von einem Objekt zu erzwingen. Das CLR verwendet die Konvention, dass solch ein Objekt die IDisposable-Schnittstelle implementieren sollte, die über eine Dispose-Methode verfügt. Wenn ein Client mit einem Objekt fertig ist, das die Dispose-Methode nutzt, kann dieser Client explizit die Dispose-Methode aufrufen, so dass die Ressourcen des Objekts freigegeben werden. Ein Objekt, das als Wrapper für eine Datenbankverbindung dient, sollte eine Dispose-Methode offen legen.
Der Ablaufverfolgungs-Garbagecollector kann Objekte in Verweisschleifen korrekt freigeben. Die Leistung des Ablaufverfolgungs-Garbagecollectors ist außerdem viel höher als die Leistung des Verweiszählers.

Aktualisierungs-
Assistent

In den meisten Fällen bereitet diese Änderung keine Probleme. Wenn Sie eine Codeanweisung haben, in der ein Ressourcenhandle geöffnet ist (Verbindungs- oder Dateihandle), sollten Sie dieses Handle explizit schließen. Das Problem wird frühzeitig erkannt, und es wird ein Laufzeitfehler gemeldet.

 

Arrays

Visual
Basic 6.0

Arrays können mit ganzzahligen unteren und oberen Grenzen definiert werden. Die Option Base-Anweisung wird verwendet, um die standardmäßige untere Grenze zu bestimmen, wenn in der Deklaration kein Bereich angegeben ist.

Visual Basic.NET

Für eine Interoperabilität mit anderen Sprachen müssen alle Arrays die untere Grenze Null haben. Dadurch wird die Option Base-Anweisung überflüssig.

Aktualisierungs-
Assistent

 

ReDim

Visual
Basic 6.0

In Visual Basic 6.0 wird eine Unterscheidung zwischen Arrays fester Größe und Arrays variabler Größe gemacht. Arrays fester Größe werden mit der Dim-Anweisung deklariert, die die Grenzen des Arrays in dieser Deklaration mit einbezieht. Dynamische Arrays werden in Dim-Anweisungen deklariert, indem keine Informationen zu Grenzen angegeben werden. Das dynamische Array muss dann mit der ReDim-Anweisung umgestaltet werden, bevor es verwendet werden kann. In Visual Basic 6.0 ist die ReDim-Anweisung eine Methode zum schnellen Deklarieren und Zuordnen von Speicher für ein dynamisches Array in einer einzigen Anweisung. Die ReDim-Anweisung ist die einzige Anweisung in Visual Basic 6.0, die sowohl zum Deklarieren als auch zum Initialisieren von Variablen verwendet werden kann.

Visual Basic.NET

Die ReDim-Anweisung wird hier nur zum Zuordnen oder Neuzuordnen des Speichers und nicht zum Neuzuordnen des Arrays verwendet. Das ergibt sich daraus, dass alle Arrays in Visual Basic.NET dynamisch sind. Eine Dim-Anweisung kann in Visual Basic.NET sowohl zum Deklarieren als auch zum Initialisieren eines dynamischen Arrays verwendet werden.
Weil alle Variablendeklarationen einen Initialwert für Variablen sowohl deklarieren als auch festlegen können, ist die Verwendung von ReDim zum Deklarieren und Initialisieren von Variablen redundant und unnötig. Dadurch, dass nur die Dim-Anweisung zum Deklarieren von Variablen verwendet werden muss, wird die Sprache einfacher und konsistenter.

Aktualisierungs-
Assistent

Wenn ReDim() zum Deklarieren eines Arrays verwendet wird, wird die entsprechende Deklaration automatisch für Sie in die Codeanweisung eingefügt. Es empfiehlt sich jedoch, die Dim-Anweisung selbst in das Array einzufügen, da die Verwendung von ReDim zur Deklaration des Arrays voraussetzt, dass das Aktualisierungstool die richtige Deklaration ausführt. Durch ReDim wird der Code außerdem mehrdeutig, da das Array an zwei Stellen identisch deklariert wird.

 

Zuweisung 

Visual
Basic 6.0

Es gibt zwei Formen der Zuweisung: Let (Standard) und Set. Set Zuweisung cn.

Visual Basic.NET

Es gibt nur eine Form der Zuweisung. x = y bedeutet, dass der Wert der Variable oder Eigenschaft y der Variable oder Eigenschaft x zugewiesen wird. Der Wert einer Variablen vom Typ 'Objekt' ist der Verweis auf die Objektinstanzen. Wenn also x und y Variablen vom Typ 'Verweis' sind, wird eine Verweiszuweisung durchgeführt. Diese eine Form der Zuweisung reduziert die Komplexität in der Sprachsyntax und lässt den Code besser lesbar aussehen.

Aktualisierungs-
Assistent

Set- und Let-Anweisungen werden entfernt. Die Standardeigenschaften für stark typisierte Objekte werden aufgelöst und explizit dem Code hinzugefügt.
Weitere Informationen zu diesem Thema finden Sie in dem Whitepaper Vorbereiten Ihrer Visual Basic 6.0-Anwendungen für die Aktualisierung auf Visual Basic.NET

 

And, Or, Xor und Not 

Visual
Basic 6.0

Die Operatoren And, Or, Xor und Not führen je nach Ausdruck sowohl logische als auch bitweise Operationen durch.

Visual Basic.NET

And, Or und Xor können nur auf den Typ Boolean angewendet werden. Der And-Operator und der Or-Operator schließen die Auswertung kurz, wenn der Wert des ersten Operanden ausreicht, um das Ergebnis des Operators zu bestimmen. Die neuen Operatoren BitOr, BitAnd und BitXor werden für bitweise logische Operationen verwendet. Die Bitxxx-Operatoren schließen nicht kurz.

Aktualisierungs-
Assistent

Wenn die And/Or-Anweisung nicht boolesch ist oder Funktionen, Methoden oder Eigenschaften enthält, wird sie mit einer Kompatibilitätsfunktion mit dem gleichen Verhalten wie in Visual Basic 6.0 aktualisiert. Wenn die And/Or-Anweisung boolesch ist, wird sie auf die systemeigene Visual Basic.Net-Anweisung aktualisiert.
Weitere Informationen zu diesem Thema finden Sie in dem Whitepaper Vorbereiten Ihrer Visual Basic 6.0-Anwendungen für die Aktualisierung auf Visual Basic.NET

 

Rangfolge von Operatoren 

Visual
Basic 6.0

Die Rangfolge der logischen und bitweisen Operatoren And, Or, Xor und Not ist höher als die Rangfolge der Vergleichsoperatoren.

Visual Basic.NET

Die Rangfolge der logischen und bitweisen Operatoren And, Or, Xor und Not ist niedriger als die Rangfolge der Vergleichsoperatoren, so dass a > b And a < c ausgewertet wird zu (a > b) And (a < c). Die Rangfolge der neuen Operatoren BitAnd, BitOr und BitXor ist höher als die Rangfolge der Vergleichsoperatoren, so dass a BitAnd &HFFFF <> 0 ausgewertet wird zu ((a BitAnd &HFFFF) <> 0).
Da BitAnd, BitOr und BitNot Operationen sind, die numerische Ergebnisse zurückgeben, ist ihre Rangfolge höher als die der relationalen Operatoren, denn die Standardrangfolge ermöglicht es, dass das Ergebnis einer dieser Operatoren mit einem anderen Wert verglichen werden kann.

Aktualisierungs-
Assistent

Wird vom Aktualisierungs-Assistenten unterstützt. Weitere Informationen zu diesem Thema finden Sie in dem Whitepaper Vorbereiten Ihrer Visual Basic 6.0-Anwendungen für die Aktualisierung auf Visual Basic.NET

 

Aufrufen von Prozeduren 

Visual
Basic 6.0

Es werden zwei Formen von Prozeduraufrufen unterstützt: Ein Aufruf verwendet die Call-Anweisung (bei dieser Form müssen Klammern um die Liste der Argumente gesetzt werden), der andere verwendet die Call-Anweisung nicht (bei dieser Form dürfen keine Klammern um die Argumentliste gesetzt werden).
In Visual Basic 6.0 rufen Entwickler i.Allg. eine Prozedur auf, ohne das Aufrufschlüsselwort anzugeben, aber sie versuchen meist, Klammern um die Argumentliste zu setzen. Wenn mehr als ein Parameter gegeben ist, erkennt der Compiler diesen Versuch glücklicherweise und gibt einen Syntaxfehler aus. Wenn jedoch nur ein Parameter gegeben ist, haben die Klammern um das Einzelargument den Effekt, dass eine Argumentvariable ByVal (nach Wert) und nicht ByRef (nach Verweis) übergeben wird. Dies kann zu versteckten Fehlern führen, die schwierig ausfindig zu machen sind.

Visual Basic.NET

Es sind jetzt in allen Fällen Klammern um Argumentlisten erforderlich

Aktualisierungs-
Assistent

Klammern werden in Prozeduraufrufe eingefügt, in denen keine Klammern vorhanden sind.

 

Statische Prozeduren 

Visual
Basic 6.0

Prozeduren können mit dem Schlüsselwort Static deklariert werden. Static gibt an, dass die lokalen Variablen der Prozedur zwischen Aufrufen erhalten bleiben.

Visual Basic.NET

Das Schlüsselwort Static wird in Prozeduren nicht unterstützt, und alle statischen lokalen Variablen müssen explizit mit Hilfe der Static-Anweisung deklariert werden.
Es ist nicht sehr aufwändig, alle Variablen innerhalb einer Prozedur als Static zu deklarieren. Durch Entfernen dieses Features wird die Sprache vereinfacht und die Lesbarkeit des Codes verbessert, da lokale Variablen immer dem Stack zugeordnet sind, sofern sie nicht explizit als Static deklariert werden.

Aktualisierungs-
Assistent

Falls eine Prozedur als Static gekennzeichnet ist, werden alle lokalen Variablendeklarationen in Static geändert.

 

Parameterstandard "ByVal/ByRef"

Visual
Basic 6.0

Parameter, für die kein ByVal oder ByRef angegeben ist, sind standardmäßig auf ByRef gesetzt.

Visual Basic.NET

Parameter, für die kein ByVal oder ByRef angegeben ist, sind standardmäßig auf ByVal gesetzt.
Durch den ByVal-Standard anstelle des ByRef-Standards wird das Problem behoben, das auftrat, wenn eine Prozedur irrtümlich eine im Aufrufer weitergeleitete Variable veränderte. Zudem ist die Aufrufkonvention nun konsistent mit der Zuweisungskonvention: Parameter werden effektiv an die Ausdrücke gebunden, die von einer Zuweisung des Ausdrucks an den formalen Parameter weitergeleitet werden.
Der Übergang von Visual Basic 6.0 zu Visual Basic.NET stiftet weniger Verwirrung beim Benutzer, weil die IDE automatisch das Schlüsselwort ByVal in allen Parameterdeklarationen hinzufügt, die der Benutzer ohne explizites Festlegen von ByVal oder ByRef eingibt.

Aktualisierungs-
Assistent

ByRef wird Parametern hinzugefügt, die keinen ByVal- bzw. ByRef-Modifizierer haben.

 

"IsMissing" und Optionale Parameter 

Visual
Basic 6.0

Optionale Variant-Parameter ohne Standardwerte werden in einen speziellen Fehlercode initialisiert, der mit Hilfe der IsMissing-Funktion erkannt werden kann.

Visual Basic.NET

Visual Basic.NET erfordert, dass ein Standardwert für alle optionalen Parameter angegeben wird. Die Sprache wird so stark vereinfacht, indem die Anzahl spezieller Werte reduziert wird.

Aktualisierungs-
Assistent

IsMissing-Funktionen werden durch IsNothing-Funktionen ersetzt und mit einer Aktualisierungswarnung in Kommentarform versehen.

 

"ParamArray"-Parameter 

Visual
Basic 6.0

Wenn Variablen an ein ParamArray-Argument übergeben werden, können sie durch die aufgerufene Funktion verändert werden. ByValParamArray-Elemente werden nicht unterstützt.

Visual Basic.NET

Wenn Variablen an ein ParamArray-Argument übergeben werden, können sie nicht durch die aufgerufene Funktion verändert werden. ByRefParamArray-Elemente werden nicht unterstützt.
Ein Szenario, dass ParamArray-Argumente keine Variablen verändern, die an sie übergeben werden, ist viel häufiger anzutreffen. Durch das Nichtunterstützen von ByRefParamArray-Argumenten wird die ParamArray-Aufrufkonvention vereinfacht, weil ParamArray-Argumente zu normalen Arrays werden. So können ParamArray-Argumente in jeden Elementyp erweitert werden, und Funktionen, die ParamArray-Argumente erwarten, können direkt mit einem Array anstatt einer Argumentliste aufgerufen werden.

Aktualisierungs-
Assistent

ParamArray-Argumente werden in Prozeduren mit einer Aktualisierungswarnung in Kommentarform versehen. Die folgende Codeanweisung:

Function MyFunction(ParamArray p() As Variant)  '...  End Function

wird aktualisiert auf:

' UPGRADE_WARNING: ParamArray p was changed from ByRef to ByVal  Function MyFunction(ByVal ParamArray p() As Object)  '...  End Function

 

"As Any"-Parameter in Deklarationen 

Visual
Basic 6.0

Ein Parameter einer systemeigenen API konnte As Any deklariert werden. In diesem Fall konnte ein Aufruf an die systemeigene API einen beliebigen Datentyp weiterleiten. Diese Möglichkeit wurde unterstützt, um aufrufende APIs zu ermöglichen, deren Parameter zwei oder mehr Datentypen unterstützten.

Visual Basic.NET

Es können überladene Declare-Anweisungen definiert werden, die es einer systemeigenen API erlauben, mit zwei oder mehr Datentypen aufgerufen zu werden. Die folgende Declare-Anweisung:

Private Declare Function GetPrivateProfileString _  Lib "kernel32" Alias "GetPrivateProfileStringA" ( _    ByVal lpApplicationName As String, _    ByVal lpKeyName As Any, _    ByVal lpDefault As String, _    ByVal lpReturnedString As String, _    ByVal nSize As Long, _    ByVal lpFileName As String) As Long

könnte durch zwei Declare-Versionen ersetzt werden:

Overloads Private Declare Function GetPrivateProfileStringKey _Lib "kernel32" Alias "GetPrivateProfileStringA" ( _    ByVal lpApplicationName As String, _    ByVal lpKeyName As String, _    ByVal lpDefault As String, _    ByVal lpReturnedString As String, _     ByVal nSize As Long, _    ByVal lpFileName As String) As LongOverloads Private Declare Function GetPrivateProfileStringNullKey _    Lib "kernel32" Alias"GetPrivateProfileStringA" ( _    ByVal lpApplicationName As String, _    ByVal lpKeyName As Long, _    ByVal lpDefault As String, _    ByVal lpReturnedString As String, _    ByVal nSize As Long, _    ByVal lpFileName As String) As Long

Dies verbessert die Typsicherheit und reduziert die Gefahr von Softwarefehlern, die zum Absturz des Programms führen. Dies kann passieren, weil der Compiler es der API nicht gestattet, mit anderen Datentypen aufgerufen zu werden als denen, die explizit als akzeptabel definiert sind.

Aktualisierungs-
Assistent

Declare-Anweisungen mit As Any-Parametern werden in Prozeduren mit einer Aktualisierungswarnung in Kommentarform versehen.

 

Implements 

Visual
Basic 6.0

Die Implements-Anweisung legt eine Schnittstelle oder Klasse fest, die in dem Klassenmodul implementiert wird, in dem sie erscheint.

Visual Basic.NET

Implements in Visual Basic.NET unterscheidet sich in zwei Verhalten grundsätzlich von Implements in Visual Basic 6.0:

  • Klassen können nicht in Implements-Anweisungen festgelegt werden.
  • Jede Methode, die eine Schnittstelle implementiert, benötigt eine Implements-Klausel hinter jeder Methodendeklarationsanweisung. Diese Klausel legt fest, welche Schnittstellenmethode implementiert wird.

Die Lesbarkeit wird dadurch verbessert, dass eine Implements-Klausel für jede Methode benötigt wird, die eine Methode in einer Schnittstelle implementiert; beim Lesen des Codes wird ersichtlich, dass die Methode zum Implementieren einer Schnittstellenmethode verwendet wird.

Aktualisierungs-
Assistent

Wenn Klasse a Klasse b implementiert, wird die Schnittstelle für Klasse b deklariert, und Klasse a wird geändert, um die Schnittstelle der Klasse b zu implementieren:

Interface _b      Function MyFunction() As String  End Interface  Class a      Implements _b      Function b_MyFunction() As String Implements _b.MyFunction  End Function  End Class

 

"Property"-Funktionen 

Visual
Basic 6.0

In Visual Basic 6.0 können die Property-Funktionen Get, Let und Set für eine bestimmte Eigenschaft mit unterschiedlichen Ebenen des Zugriffs deklariert werden. Die PropertyGet-Funktion kann z.B. eine Public-Funktion sein, während die PropertyLet-Funktion als Friend-Funktion deklariert wird.

Visual Basic.NET

Die Funktionen Get und Set für eine Eigenschaft müssen beide die gleiche Zugriffsebene haben. So kann Visual Basic.NET mit anderen .NET-Sprachen interoperieren.

Aktualisierungs-
Assistent

Wenn die Zugriffsebene unterschiedlich ist, wird die neue Eigenschaft Public.

 

Standardeigenschaften

Visual
Basic 6.0

Jedes Element kann als Standardeigenschaft für eine Klasse gekennzeichnet werden.

Visual Basic.NET

Nur Eigenschaften, die Parameter akzeptieren, können als Standardeigenschaften gekennzeichnet werden. Eigenschaften mit Parametern erstellen häufig die Indizes für eine Auflistung.
Dies macht den Code leichter lesbar, da ein Verweis auf eine Objektvariable ohne Element sich immer auf das Objekt selbst bezieht, nicht auf das Objekt in anderen Kontexten oder den Standardwert der Eigenschaft in anderen Kontexten. Die Anweisung Call Display(TextBox1) könnte z.B. die Textfeldinstanz oder den Inhalt des Textfeldes an die Display-Funktion übergeben.
Durch das Aufheben dieser Zweideutigkeit wird es auch unnötig, eine separate Anweisung zum Durchführen der Verweiszuweisung zu schreiben. Die Zuweisung x = y bedeutet, dass der Wert der Variable y der Variablen x zugewiesen wird, und nicht, dass die Standardeigenschaft des Objekts, auf das y verweist, der Standardeigenschaft des Objekts, auf das x verweist, zugewiesen wird.

Aktualisierungs-
Assistent

Standardeigenschaften werden, wenn möglich, aufgelöst. Fehlerkommentare werden bei Fehlern hinzugefügt, die nicht behoben werden können (bei spät gebundenen Objekten).

 

Enumerationen

Visual
Basic 6.0

Enumerationskonstanten können ohne Qualifizierung referenziert werden.

Visual Basic.NET

Enumerationskonstanten können ohne Qualifizierung referenziert werden, wenn auf der Datei- oder Projektebene eine Import-Anweisung für die Enumeration hinzugefügt wurde.
So wird die Konsistenz mit Klassen, Strukturen und Schnittstellen gewahrt, indem Elementen generische Namen ohne das Risiko eines Konflikts mit Namen vorhandener Elemente zugeteilt werden können. Die Farbe-Enumeration und die Obst-Enumeration können z.B. beide eine Konstante namens Orange enthalten. In Visual Basic 6.0 gibt es die Konvention, Enumerationskonstanten ein Präfix voranzustellen, um sie eindeutig erscheinen zu lassen. Das führt zu merkwürdigen Namen wie MsFarbeOrange und MsObstOrange.

Aktualisierungs-
Assistent

Verweise auf Enumerationen werden vollqualifiziert.

 

While

Visual
Basic 6.0

While-Anweisungen werden mit einer WEnd-Anweisung abgeschlossen.

Visual Basic.NET

Der Konsistenz mit anderen Blockstrukturen halber heißt die beendende Anweisung für While jetzt End While. Dies verbessert Sprachkonsistenz und -lesbarkeit.

Aktualisierungs-
Assistent

WEnd-Anweisungen werden in End While geändert.

 

On.GoTo und On.GoSub 

Visual
Basic 6.0

Die Anweisungen OnausdruckGoTozielliste und OnausdruckGoSubzielliste verzweigen zu einer von mehreren angegebenen Zeilen in der Zielliste, je nach Wert des Ausdrucks.

Visual Basic.NET

On.GoTo und On.GoSub sind nichtstrukturierte Programmierkonstrukte. Ihre Verwendung lässt Programme komplizierter und unverständlicher werden. Select Case ist möglicherweise ein strukturierteres und flexibleres Mittel zum Verzweigen mehrerer Programmströme.
Anmerkung:On Error GoTo wird weiterhin unterstützt.

Aktualisierungs-
Assistent

Die folgende Codeanweisung:

On MyVariable GoTo 100,200,300

wird mit einem Aktualisierungsfehler in Kommentarform versehen:

' UPGRADE_ISSUE On MyVariable GoTo was not upgradedOn MyVariable GoTo 100,200,300

Sie sollten Ihren Code umschreiben, um solche Anweisungen zu vermeiden. Beispiel:

On x Goto 100,200,300

kann wie folgt neu geschrieben werden:

Select Case x      Case 1: 'Hier Code für Zeile 100 einfügen      Case 2: 'Hier Code für Zeile 200 einfügen      Case 3: 'Hier Code für Zeile 300 einfügen  End Select

 

GoSub.Return 

Visual
Basic 6.0

Die GoSubzeile . Return-Anweisung verzweigt sich innerhalb einer Prozedur in eine Unterroutine und gibt aus dieser Ergebnisse zurück.

Visual Basic.NET

GoSub.Return ist ein nichtstrukturiertes Programmierkonstrukt. Seine Verwendung lässt Programme komplizierter und unverständlicher werden. Eine strukturiertere Alternative kann das Erstellen separater Prozeduren sein, die Sie aufrufen können.

Aktualisierungs-
Assistent

Wie On...GoTo-Anweisungen werden auch diese Anweisungen in Prozeduren mit einer Aktualisierungswarnung in Kommentarform versehen.

 

LSet

Visual
Basic 6.0

LSet füllt eine Zeichenfolge mit Leerstellen auf, damit sie eine festgelegte Länge bekommt, oder kopiert eine Variable vom Typ 'Benutzerdefiniert' in eine Variable eines anderen benutzerdefinierten Typs.

Visual Basic.NET

Die LSet-Anweisung wird nicht unterstützt. LSet ist nicht typsicher; es kann also zu Laufzeitfehlern kommen. Gerade weil LSet nicht typsicher ist, erfordert die Funktion vollstes Vertrauen in die Ausführung. Durch das Entfernen von LSet wird das Kopieren einer Struktur über eine andere unmöglich; Sie können jedoch denselben Effekt erzielen, indem Sie Ihren Visual Basic.NET-Code so ändern, dass er RtlCopyMemory nutzt.

Aktualisierungs-
Assistent

Die folgende Codeanweisung:

LSet a1 = a2

wird mit einem Aktualisierungsfehler in Kommentarform versehen:

' UPGRADE_ISSUE: LSet cannot assign a UDT from one type to another  LSet a1 = a2

 

VarPtr, StrPtr und ObjPtr 

Visual
Basic 6.0

VarPtr, StrPtr und ObjPtr geben die Adressen von Variablen als Ganzzahlen zurück, die dann an API-Funktionen übergeben werden können, die Adressen akzeptieren, z.B. RtlCopyMemory. VarPtr gibt die Adresse einer Variablen zurück, StrPtr gibt die Adresse einer Zeichenfolge zurück, und ObjPtr gibt die Adresse eines Objekts zurück. Diese Funktionen sind undokumentiert.

Visual Basic.NET

Die Adressen von Datenelementen können abgerufen werden, der Abruf muss jedoch durch Aufrufe in das CLR erfolgen. Das CLR kann Elemente normalerweise beliebig im Speicher verschieben; es muss also wissen, wann das Element nicht verschoben werden soll, während die Adresse verwendet wird. Die folgende Codeanweisung ruft die Adresse eines Objekts ab:

Dim MyGCHandle As GCHandle = GCHandle.Alloc(o,GCHandleType.Pinned)Dim Address As Integer = CInt(MyGCHandle.AddrOfPinnedObject())'... MyGCHandle.Free() 'ermöglicht es der Objektinstanz, noch einmal verschoben zu werden

Durch die Möglichkeit, dass Datenelemente von der Laufzeit verschoben werden können, wird die Leistung der Laufzeit verbessert.

Aktualisierungs-
Assistent

Es gibt keine automatische Aktualisierung für diese Anweisungen, sie werden daher mit dem Aktualisierungskommentar "(Anweisung) is not supported" versehen. Die folgende Codeanweisung:

a = VarPtr(b)

wird aktualisiert auf:

' UPGRADE_ISSUE: Function VarPtr() is not supported  a = VarPtr(b)

Dies führt auch noch zu einem Kompilierungsfehler.