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ą Object
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 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 num1
przykł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 Integer
someNumbers2
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).