Udostępnij za pośrednictwem


Wnioskowanie typu lokalnego (Visual Basic)

Kompilator języka Visual Basic używa wnioskowania typu w celu określenia typów danych zmiennych lokalnych zadeklarowanych bez klauzuli As . Kompilator wywnioskuje typ zmiennej z typu wyrażenia inicjalizacji. Dzięki temu można zadeklarować zmienne bez jawnego stwierdzenia typu, jak pokazano w poniższym przykładzie. W wyniku deklaracji obydwa num1 i num2 są silnie typizowane jako liczby całkowite.

Public Sub inferenceExample()

    ' Using explicit typing.
    Dim num1 As Integer = 3

    ' Using local type inference.
    Dim num2 = 3

End Sub

Uwaga / Notatka

Jeśli w poprzednim przykładzie nie chcesz, aby num2 został określony jako Integer, możesz określić inny typ, używając deklaracji takiej jak Dim num3 As Object = 3 lub Dim num4 As Double = 3.

Uwaga / Notatka

Wnioskowanie typu może być używane tylko w przypadku zmiennych niestacjonanych lokalnych; nie można go użyć do określenia typu pól, właściwości lub funkcji klasy.

Wnioskowanie typu lokalnego ma zastosowanie na poziomie procedury. Nie można jej używać do deklarowania zmiennych na poziomie modułu (w klasie, strukturze, module lub interfejsie, ale nie w ramach procedury lub bloku). Jeśli num2 w poprzednim przykładzie byłoby polem klasy zamiast zmiennej lokalnej w procedurze, deklaracja spowodowałaby błąd, gdy Option Strict jest włączone, a num2 byłoby klasyfikowane jako Object przy wyłączonym Option Strict. Podobnie wnioskowanie typu lokalnego nie ma zastosowania do zmiennych poziomu procedury zadeklarowanych jako Static.

Wnioskowanie typu a opóźnione powiązanie

Kod korzystający z wnioskowania typu przypomina kod, który opiera się na późnym wiązaniu. Jednak wnioskowanie typu silnie typuje zmienną zamiast zostawiać ją jako Object. Kompilator używa inicjalizatora zmiennej, aby w czasie kompilacji określić typ zmiennej i utworzyć wcześnie wiązany kod. W poprzednim przykładzie num2, podobnie jak num1, jest wpisany jako Integer.

Zachowanie zmiennych z wczesnym wiązaniem różni się od tych z późnym wiązaniem, dla których typ jest znany dopiero w czasie wykonywania. Znajomość typu na początku umożliwia kompilatorowi identyfikowanie problemów przed wykonaniem, przydzielenie pamięci dokładnie i wykonanie innych optymalizacji. Wczesne powiązanie umożliwia również zintegrowanemu środowisku projektowemu (IDE) języka Visual Basic dostarczanie pomocy IntelliSense dotyczącej członków obiektu. Wczesne powiązanie jest również preferowane dla wydajności systemu. Jest to spowodowane tym, że całe dane przechowywane w zmiennej wiązanej dynamicznie muszą być opakowane jako typ Object, a uzyskiwanie dostępu do elementów tego typu w czasie wykonywania może spowalniać działanie programu.

Przykłady

Wnioskowanie typu występuje, gdy zmienna lokalna jest zadeklarowana bez As klauzuli i zainicjowana. Kompilator używa typu przypisanej wartości początkowej jako typu zmiennej. Na przykład każdy z poniższych wierszy kodu deklaruje zmienną typu String.

' Using explicit typing.
Dim name1 As String = "Springfield"

' Using local type inference.
Dim name2 = "Springfield"

Poniższy kod przedstawia dwa równoważne sposoby tworzenia tablicy liczb całkowitych.

' 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}

Wygodne jest użycie wnioskowania typu w celu określenia typu zmiennej sterującej pętli. W poniższym kodzie kompilator wnioskuje, że number jest Integer, ponieważ someNumbers2 z poprzedniego przykładu jest tablicą liczb całkowitych.

Dim total = 0
For Each number In someNumbers2
    total += number
Next

Wnioskowanie typu lokalnego może być używane w Using instrukcjach w celu ustalenia typu nazwy zasobu, jak pokazano w poniższym przykładzie.

Using proc = New System.Diagnostics.Process
    ' Insert code to work with the resource.
End Using

Typ zmiennej można również wywnioskować z zwracanych wartości funkcji, jak pokazano w poniższym przykładzie. Zarówno pList1, jak i pList2 są tablicami procesów, ponieważ Process.GetProcesses zwraca tablicę procesów.

' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()

' Using local type inference.
Dim pList2 = Process.GetProcesses()

Opcja Infer

Option Infer umożliwia określenie, czy wnioskowanie typu lokalnego jest dozwolone w określonym pliku. Aby włączyć lub zablokować tę opcję, wpisz jedną z poniższych instrukcji na początku pliku.

Option Infer On

Option Infer Off

Jeśli nie określisz wartości w Option Infer kodzie, wartością domyślną kompilatora jest Option Infer On.

Jeśli wartość ustawiona Option Infer w pliku powoduje konflikt z wartością ustawioną w środowisku IDE lub w wierszu polecenia, wartość w pliku ma pierwszeństwo.

Aby uzyskać więcej informacji, zobacz Instrukcja wnioskowania opcji i Strona kompilacji, Projektant projektu (Visual Basic).

Zobacz także