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 |
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- |
Variant-Datentypen werden in Object konvertiert. Die Codeanweisung: Dim x As Variant wird aktualisiert auf: Dim x As Object |
Integer und Long
Visual |
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. |
Aktualisierungs- |
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 |
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). |
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- |
Currency-Datentypen werden in Decimal konvertiert. Die Codeanweisung: Dim x As Currency wird aktualisiert auf: Dim x As Decimal |
Datum
Visual |
Eine Date-Variable wird intern im Double-Format gespeichert und kann als Double bearbeitet werden. |
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- |
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 |
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- |
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 |
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. |
Aktualisierungs- |
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 |
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- |
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 |
True hat den Wert -1. |
Visual Basic.NET |
True hat den Wert 1. |
Aktualisierungs- |
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 |
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- |
NULL und NULL-Verteilung
Visual |
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. |
Aktualisierungs- |
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 |
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- |
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 |
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. |
Aktualisierungs- |
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 |
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. |
Aktualisierungs- |
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 |
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. |
Aktualisierungs- |
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 |
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- |
ReDim
Visual |
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. |
Aktualisierungs- |
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 |
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- |
Set- und Let-Anweisungen werden entfernt. Die Standardeigenschaften für stark typisierte Objekte werden aufgelöst und explizit dem Code hinzugefügt. |
And, Or, Xor und Not
Visual |
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- |
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. |
Rangfolge von Operatoren
Visual |
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). |
Aktualisierungs- |
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 |
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). |
Visual Basic.NET |
Es sind jetzt in allen Fällen Klammern um Argumentlisten erforderlich |
Aktualisierungs- |
Klammern werden in Prozeduraufrufe eingefügt, in denen keine Klammern vorhanden sind. |
Statische Prozeduren
Visual |
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. |
Aktualisierungs- |
Falls eine Prozedur als Static gekennzeichnet ist, werden alle lokalen Variablendeklarationen in Static geändert. |
Parameterstandard "ByVal/ByRef"
Visual |
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. |
Aktualisierungs- |
ByRef wird Parametern hinzugefügt, die keinen ByVal- bzw. ByRef-Modifizierer haben. |
"IsMissing" und Optionale Parameter
Visual |
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- |
IsMissing-Funktionen werden durch IsNothing-Funktionen ersetzt und mit einer Aktualisierungswarnung in Kommentarform versehen. |
"ParamArray"-Parameter
Visual |
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. |
Aktualisierungs- |
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 |
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- |
Declare-Anweisungen mit As Any-Parametern werden in Prozeduren mit einer Aktualisierungswarnung in Kommentarform versehen. |
Implements
Visual |
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:
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- |
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 |
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- |
Wenn die Zugriffsebene unterschiedlich ist, wird die neue Eigenschaft Public. |
Standardeigenschaften
Visual |
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. |
Aktualisierungs- |
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 |
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. |
Aktualisierungs- |
Verweise auf Enumerationen werden vollqualifiziert. |
While
Visual |
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- |
WEnd-Anweisungen werden in End While geändert. |
On.GoTo und On.GoSub
Visual |
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. |
Aktualisierungs- |
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 |
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- |
Wie On...GoTo-Anweisungen werden auch diese Anweisungen in Prozeduren mit einer Aktualisierungswarnung in Kommentarform versehen. |
LSet
Visual |
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- |
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 |
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- |
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. |