Wnioskowanie o typie lokalnym (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 obie 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

Jeśli w poprzednim przykładzie nie chcesz num2 wpisywać wartości Integer, możesz określić inny typ przy użyciu deklaracji takiej jak Dim num3 As Object = 3 lub Dim num4 As Double = 3.

Uwaga

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ło polem klasy zamiast zmiennej lokalnej w procedurze, deklaracja spowoduje błąd z Option Strict włączonym i będzie klasyfikowana num2 jako z wyłączoną ObjectOption 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 powiązaniu. Jednak wnioskowanie typu silnie typ typuje zmienną zamiast pozostawiać ją jako Object. Kompilator używa inicjatora zmiennej, aby określić typ zmiennej w czasie kompilacji w celu utworzenia kodu wczesnej granicy. W poprzednim przykładzie ciąg num2, na num1przykład , jest wpisany jako Integer.

Zachowanie zmiennych z wczesnym ograniczeniem różni się od tego, że zmienne związane z opóźnieniem, dla których typ jest znany tylko 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 zapewnienie pomocy funkcji IntelliSense dla elementów członkowskich obiektu. Wczesne powiązanie jest również preferowane dla wydajności. Jest to spowodowane tym, że wszystkie dane przechowywane w zmiennej powiązanej z opóźnieniem muszą być opakowane jako typ Object, a uzyskiwanie dostępu do elementów członkowskich typu w czasie wykonywania sprawia, że program jest wolniejszy.

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 wywnioskuje, że number z poprzedniego przykładu jest IntegersomeNumbers2 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. Obie pList1 metody 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()

Wnioskowanie opcji

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 Option Infer Statement and Compile Page (Instrukcja wnioskowania opcji i strona kompilacji), Project Projektant (Visual Basic).

Zobacz też