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).

Siehe auch