Lokaler Typrückschluss (Visual Basic)
Der Visual Basic-Compiler verwendet Typrückschlüsse, um die Datentypen lokaler Variablen zu bestimmen, die ohne eine As
-Klausel deklariert wurden. Der Compiler leitet den Typ der Variablen vom Typ des Initialisiererausdrucks ab. Auf diese Weise können Sie wie im folgenden Beispiel gezeigt Variablen deklarieren, ohne explizit einen Typ anzugeben. Als Ergebnis der Deklarationen werden num1
und num2
als Integer stark typisiert.
Public Sub inferenceExample()
' Using explicit typing.
Dim num1 As Integer = 3
' Using local type inference.
Dim num2 = 3
End Sub
Hinweis
Wenn num2
im vorherigen Beispiel nicht als Integer
typisiert werden soll, können Sie mithilfe einer Deklaration wie Dim num3 As Object = 3
oder Dim num4 As Double = 3
einen anderen Typ angeben.
Hinweis
Typrückschlüsse können nur für nicht statische lokale Variablen verwendet werden. Sie können nicht verwendet werden, um den Typ von Klassenfeldern, Eigenschaften oder Funktionen zu bestimmen.
Lokale Typrückschlüsse werden auf Prozedurebene angewendet. Sie können nicht verwendet werden, um Variablen auf Modulebene zu deklarieren (innerhalb einer Klasse, Struktur, eines Moduls oder einer Schnittstelle, jedoch nicht innerhalb einer Prozedur oder eines Blocks). Wenn num2
im vorherigen Beispiel anstelle einer lokalen Variablen in einer Prozedur ein Feld einer Klasse wäre, würde die Deklaration zu einem Fehler mit aktivierter Option Strict
-Anweisung führen, und num2
würde als Object
mit deaktivierter Option Strict
-Anweisung klassifiziert werden. Ebenso werden lokale Typrückschlüsse nicht auf Prozedurebenenvariablen angewendet, die als Static
deklariert werden.
Typrückschlüsse im Vergleich zu späten Bindungen
Code, der Typrückschlüsse verwendet, ähnelt Code, der auf späten Bindungen basiert. Bei einem Typrückschluss wird die Variable jedoch stark typisiert, anstatt sie als Object
zu übernehmen. Der Compiler verwendet den Initialisierer einer Variablen, um den Typ der Variablen zur Kompilierzeit zu bestimmen und somit früh gebundenen Code zu generieren. Im vorherigen Beispiel wird num2
wie num1
als Integer
typisiert.
Das Verhalten von früh gebundenen Variablen unterscheidet sich von jenem von spät gebundenen Variablen, bei denen der Typ nur zur Laufzeit bekannt ist. Das frühzeitige Kennen des Typs ermöglicht es dem Compiler, Probleme vor der Ausführung zu identifizieren, Arbeitsspeicher genau zuzuweisen und andere Optimierungen durchzuführen. Durch frühe Bindungen kann die integrierte Visual Basic-Entwicklungsumgebung (Integrated Development Environment, IDE) IntelliSense-Hilfe zu den Membern eines Objekts bereitstellen. Frühe Bindungen werden auch aus Leistungsgründen bevorzugt. Dies liegt daran, dass alle Daten, die in einer spät gebundenen Variablen gespeichert sind, als Object
-Typ umschlossen werden müssen, und der Zugriff auf Member des Typs zur Laufzeit macht das Programm langsamer.
Beispiele
Typrückschlüsse treten auf, wenn eine lokale Variable ohne As
-Klausel deklariert und initialisiert wird. Der Compiler verwendet den Typ des zugewiesenen Anfangswerts als Typ der Variablen. Beispielsweise deklariert jede der folgenden Codezeilen eine Variable vom Typ String
.
' Using explicit typing.
Dim name1 As String = "Springfield"
' Using local type inference.
Dim name2 = "Springfield"
Der folgende Code veranschaulicht zwei äquivalente Methoden zum Erstellen eines Arrays mit ganzen Zahlen.
' Using explicit typing.
Dim someNumbers1() As Integer = New Integer() {4, 18, 11, 9, 8, 0, 5}
' Using local type inference.
Dim someNumbers2 = New Integer() {4, 18, 11, 9, 8, 0, 5}
Es ist praktisch, Typrückschlüsse zu verwenden, um den Typ einer Schleifensteuervariablen zu bestimmen. Im folgenden Code leitet der Compiler ab, dass number
ein Integer
ist, da someNumbers2
aus dem vorherigen Beispiel ein Array aus ganzen Zahlen ist.
Dim total = 0
For Each number In someNumbers2
total += number
Next
Lokale Typrückschlüsse können wie im folgenden Beispiel veranschaulicht in Using
-Anweisungen verwendet werden, um den Typ des Ressourcennamens festzulegen.
Using proc = New System.Diagnostics.Process
' Insert code to work with the resource.
End Using
Der Typ einer Variablen kann wie im folgenden Beispiel veranschaulicht auch über die Rückgabewerte von Funktionen abgeleitet werden. pList1
und pList2
sind Arrays von Prozessen, da Process.GetProcesses
ein Array von Prozessen zurückgibt.
' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()
' Using local type inference.
Dim pList2 = Process.GetProcesses()
Option Infer
Mit Option Infer
können Sie angeben, ob lokale Typrückschlüsse in einer bestimmten Datei zulässig sind. Um die Option zu aktivieren oder zu blockieren, geben Sie am Anfang der Datei eine der folgenden Anweisungen ein.
Option Infer On
Option Infer Off
Wenn Sie in Ihrem Code keinen Wert für Option Infer
angeben, ist Option Infer On
die Standardeinstellung für den Compiler.
Wenn der in einer Datei für Option Infer
festgelegte Wert mit dem in der IDE oder in der Befehlszeile festgelegten Wert im Konflikt steht, hat der Wert in der Datei Vorrang.
Weitere Informationen finden Sie unter Option Infer-Anweisung und Seite „Kompilieren“, Projekt-Designer (Visual Basic).