Slutsatsdragning av lokal typ (Visual Basic)
Visual Basic-kompilatorn använder typinferens för att fastställa datatyperna för lokala variabler som deklareras utan en As
sats. Kompilatorn härleder variabeltypen från typen av initieringsuttryck. På så sätt kan du deklarera variabler utan att uttryckligen ange en typ, som du ser i följande exempel. Som ett resultat av deklarationerna skrivs båda num1
och num2
starkt som heltal.
Public Sub inferenceExample()
' Using explicit typing.
Dim num1 As Integer = 3
' Using local type inference.
Dim num2 = 3
End Sub
Kommentar
Om du inte vill num2
att det i föregående exempel ska skrivas som en Integer
kan du ange en annan typ med hjälp av en deklaration som Dim num3 As Object = 3
eller Dim num4 As Double = 3
.
Kommentar
Typinferens kan endast användas för icke-statiska lokala variabler. Det kan inte användas för att fastställa typen av klassfält, egenskaper eller funktioner.
Den lokala typinferensen gäller på procedurnivå. Det kan inte användas för att deklarera variabler på modulnivå (inom en klass, struktur, modul eller gränssnitt, men inte inom en procedur eller ett block). Om num2
i föregående exempel var ett fält i en klass i stället för en lokal variabel i en procedur skulle deklarationen orsaka ett fel med Option Strict
på och klassificeras num2
som en Object
med Option Strict
off. På samma sätt gäller inte lokal typinferens för variabler på procedurnivå som deklarerats som Static
.
Typinferens jämfört med sen bindning
Kod som använder typinferens liknar kod som förlitar sig på sen bindning. Typinferensen skriver dock starkt variabeln i stället för att lämna den som Object
. Kompilatorn använder en variabels initialiserare för att fastställa variabelns typ vid kompileringstillfället för att skapa kod med tidig bindning. I föregående exempel num2
, som num1
, skrivs som en Integer
.
Beteendet för tidiga variabler skiljer sig från det för sent bundna variabler, för vilka typen endast är känd vid körning. Om du känner till typen tidigt kan kompilatorn identifiera problem före körning, allokera minne exakt och utföra andra optimeringar. Tidig bindning gör det också möjligt för IDE (Visual Basic Integrated Development Environment) att tillhandahålla IntelliSense-hjälp om medlemmarna i ett objekt. Tidig bindning är också att föredra för prestanda. Detta beror på att alla data som lagras i en sen bindningsvariabel måste omslutas som typ Object
och åtkomst till medlemmar av typen vid körning gör programmet långsammare.
Exempel
Typinferens inträffar när en lokal variabel deklareras utan en As
sats och initieras. Kompilatorn använder typen av det tilldelade initialvärdet som typ av variabel. Till exempel deklarerar var och en av följande kodrader en variabel av typen String
.
' Using explicit typing.
Dim name1 As String = "Springfield"
' Using local type inference.
Dim name2 = "Springfield"
Följande kod visar två motsvarande sätt att skapa en matris med heltal.
' 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}
Det är praktiskt att använda typinferens för att fastställa typen av en loopkontrollvariabel. I följande kod härleder kompilatorn att det number
är en Integer
eftersom someNumbers2
från föregående exempel är en matris med heltal.
Dim total = 0
For Each number In someNumbers2
total += number
Next
Slutsatsdragning av lokal typ kan användas i Using
instruktioner för att fastställa resursnamnets typ, vilket visas i följande exempel.
Using proc = New System.Diagnostics.Process
' Insert code to work with the resource.
End Using
Typen av en variabel kan också härledas från returvärdena för funktioner, vilket visas i följande exempel. Både pList1
och pList2
är matriser med processer eftersom Process.GetProcesses
returnerar en matris med processer.
' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()
' Using local type inference.
Dim pList2 = Process.GetProcesses()
Alternativ härledning
Option Infer
gör att du kan ange om lokal typinferens tillåts i en viss fil. Om du vill aktivera eller blockera alternativet skriver du någon av följande instruktioner i början av filen.
Option Infer On
Option Infer Off
Om du inte anger något värde för Option Infer
i koden är Option Infer On
kompilatorns standardinställning .
Om värdet som angetts för Option Infer
i en fil står i konflikt med värdet som angetts i IDE eller på kommandoraden har värdet i filen företräde.
Mer information finns i Alternativ härledningsinstrukation och kompileringssida, Projektdesigner (Visual Basic).