Dela via


Lokal typinferens (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

Anmärkning

Om du inte vill att num2 i det föregående exemplet 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.

Anmärkning

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 vore 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 num2 skulle klassificeras som en Object med Option Strict av. 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 typedeklarerar 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 tidigt bundna variabler skiljer sig från det för sent bundna variabler, där 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 Objectoch å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 Onkompilatorns 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).

Se även