Odvození místního typu (Visual Basic)
Kompilátor jazyka Visual Basic používá odvození typu k určení datových typů místních proměnných deklarovaných bez As
klauzule. Kompilátor odvodí typ proměnné z typu inicializačního výrazu. To umožňuje deklarovat proměnné bez explicitního uvedení typu, jak je znázorněno v následujícím příkladu. V důsledku deklarací jsou obě num1
a num2
silně zadané jako celá čísla.
Public Sub inferenceExample()
' Using explicit typing.
Dim num1 As Integer = 3
' Using local type inference.
Dim num2 = 3
End Sub
Poznámka:
Pokud v předchozím příkladu nechcete num2
, aby byl zadán jako Integer
typ , můžete zadat jiný typ pomocí deklarace jako Dim num3 As Object = 3
nebo Dim num4 As Double = 3
.
Poznámka:
Odvození typu lze použít pouze pro nestatické místní proměnné; Nelze jej použít k určení typu polí třídy, vlastností nebo funkcí.
Odvození místního typu se vztahuje na úrovni procedury. Nelze ji použít k deklaraci proměnných na úrovni modulu (v rámci třídy, struktury, modulu nebo rozhraní, ale ne v rámci procedury nebo bloku). Pokud num2
by v předchozím příkladu bylo pole třídy místo místní proměnné v rámci procedury, deklarace by způsobila chybu s Option Strict
zapnutou chybou a klasifikovala num2
by jako vypnuto Option Strict
Object
. Podobně se místní odvození typu nevztahuje na proměnné na úrovni procedury deklarované jako Static
.
Odvození typu vs. pozdní vazby
Kód, který používá odvození typu, se podobá kódu, který spoléhá na pozdní vazbu. Nicméně, typ odvozování silné typy proměnné namísto opuštění jako Object
. Kompilátor používá inicializátor proměnné k určení typu proměnné v době kompilace k vytvoření kódu s časnou vazbou. V předchozím příkladu , num2
jako num1
, je zadán jako .Integer
Chování proměnných s časnou vazbou se liší od chování proměnných s pozdní vazbou, pro které je typ znám pouze za běhu. Znalost typu v rané fázi umožňuje kompilátoru identifikovat problémy před spuštěním, přidělit paměť přesně a provést další optimalizace. Časná vazba také umožňuje integrované vývojové prostředí (IDE) jazyka Visual Basic poskytovat nápovědu intelliSense k členům objektu. Časná vazba je také upřednostňovaná pro výkon. Důvodem je to, že všechna data uložená v proměnné s pozdní vazbou musí být zabalena jako typ Object
a přístup k členům typu za běhu ztěžuje program.
Příklady
Odvození typu nastane, když je místní proměnná deklarována bez As
klauzule a inicializována. Kompilátor jako typ proměnné používá typ přiřazené počáteční hodnoty. Například každý z následujících řádků kódu deklaruje proměnnou typu String
.
' Using explicit typing.
Dim name1 As String = "Springfield"
' Using local type inference.
Dim name2 = "Springfield"
Následující kód ukazuje dva ekvivalentní způsoby vytvoření pole celých čísel.
' 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}
K určení typu řídicí proměnné smyčky je vhodné použít odvození typu. V následujícím kódu kompilátor odvodí, že je Integer
to proto, že number
someNumbers2
z předchozího příkladu je pole celých čísel.
Dim total = 0
For Each number In someNumbers2
total += number
Next
Odvození místního typu lze použít v Using
příkazech k vytvoření typu názvu prostředku, jak ukazuje následující příklad.
Using proc = New System.Diagnostics.Process
' Insert code to work with the resource.
End Using
Typ proměnné lze také odvodit z návratových hodnot funkcí, jak ukazuje následující příklad. Obě pList1
a pList2
jsou pole procesů, protože Process.GetProcesses
vrací pole procesů.
' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()
' Using local type inference.
Dim pList2 = Process.GetProcesses()
Odvození možnosti
Option Infer
umožňuje určit, zda je v určitém souboru povoleno odvozovat místní typ. Pokud chcete povolit nebo zablokovat možnost, zadejte na začátku souboru jeden z následujících příkazů.
Option Infer On
Option Infer Off
Pokud v kódu nezadáte hodnotu Option Infer
, je výchozí hodnota Option Infer On
kompilátoru .
Pokud je hodnota nastavená Option Infer
v souboru v konfliktu s hodnotou nastavenou v integrovaném vývojovém prostředí nebo na příkazovém řádku, má hodnota v souboru přednost.
Další informace naleznete v tématu Příkaz odvození možnosti a stránka kompilace, Návrhář projektu (Visual Basic).