Dela via


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 Integerkan 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 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