Inférence de type local (Visual Basic)

Le compilateur Visual Basic utilise l’inférence de type permet de déterminer le type de données des variables locales déclarées sans clause As. Le compilateur déduit le type de la variable à partir du type de l’expression d’initialisation. Cela vous permet de déclarer des variables sans indiquer explicitement de type, comme illustré dans l’exemple suivant. En raison des déclarations, num1 et num2 sont fortement typés en tant qu’entiers.

Public Sub inferenceExample()

    ' Using explicit typing.
    Dim num1 As Integer = 3

    ' Using local type inference.
    Dim num2 = 3

End Sub

Notes

Si vous ne souhaitez num2 pas que dans l’exemple précédent soit tapé en tant que Integer, vous pouvez spécifier un autre type à l’aide d’une déclaration comme Dim num3 As Object = 3 ou Dim num4 As Double = 3.

Notes

L’inférence de type ne peut être utilisée que pour les variables locales non statiques ; il ne peut pas être utilisé pour déterminer le type de champs, de propriétés ou de fonctions de classe.

L’inférence de type s’applique au niveau de la procédure. Il ne peut pas être utilisé pour déclarer des variables au niveau du module (au sein d’une classe, d’une structure, d’un module ou d’une interface, mais pas au sein d’une procédure ou d’un bloc). Sinum2, dans l’exemple précédent, était un champ d’une classe au lieu d’une variable locale dans une procédure, la déclaration provoquerait une erreur avec Option Strict on et la classifiait num2 comme étant Object avec Option Strict. De même, l’inférence de type local ne s’applique pas aux variables de niveau procédure déclarées comme Static.

Inférence de type et liaison tardive

Le code qui utilise l’inférence de type ressemble au code qui s’appuie sur une liaison tardive. Toutefois, l’inférence de type tape fortement la variable au lieu de la laisser en tant que Object. Le compilateur utilise l’initialiseur d’une variable pour déterminer le type de la variable au moment de la compilation afin de produire du code lié en amont. Dans l’exemple précédent, num2, comme num1, est défini sur un type en tant que Integer.

Le comportement des variables à liaison anticipée diffère de celui des variables à liaison tardive, pour lesquelles le type n’est connu qu’au moment de l’exécution. La connaissance précoce du type permet au compilateur d’identifier les problèmes avant l’exécution, d’allouer de la mémoire avec précision et d’effectuer d’autres optimisations. La liaison anticipée permet également à l’environnement de développement intégré (IDE) Visual Basic de fournir une aide IntelliSense sur les membres d’un objet. La liaison anticipée est également recommandée pour les performances. En effet, toutes les données stockées dans une variable à liaison tardive doivent être encapsulées en tant que type Objectet l’accès aux membres du type au moment de l’exécution ralentit le programme.

Exemples

L’inférence de type se produit lorsqu’une variable locale est déclarée sans clause As et initialisée. Le compilateur utilise le type de la valeur initiale affectée comme type de la variable. Par exemple, chacune des lignes de code suivantes déclare une variable de type String.

' Using explicit typing.
Dim name1 As String = "Springfield"

' Using local type inference.
Dim name2 = "Springfield"

Le code suivant illustre deux méthodes équivalentes pour créer un tableau d’entiers.

' 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}

Il est pratique d’utiliser l’inférence de type pour déterminer le type d’une variable de contrôle de boucle. Dans le code suivant, le compilateur déduit que number est un Integer car someNumbers2 , à partir de l’exemple précédent, est un tableau d’entiers.

Dim total = 0
For Each number In someNumbers2
    total += number
Next

L’inférence de type local peut être utilisée dans des instructions Using pour établir le type du nom de la ressource, comme le montre l’exemple suivant.

Using proc = New System.Diagnostics.Process
    ' Insert code to work with the resource.
End Using

Le type d’une variable peut également être déduit des valeurs de retour des fonctions, comme le montre l’exemple suivant. pList1 et pList2 sont tous deux des tableaux de processus, car Process.GetProcesses retourne un tableau de processus.

' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()

' Using local type inference.
Dim pList2 = Process.GetProcesses()

Option Infer

Option Infer vous permet de spécifier si l’inférence de type local est autorisée dans un fichier particulier. Pour activer ou bloquer l’option, tapez l’une des instructions suivantes au début du fichier.

Option Infer On

Option Infer Off

Si vous ne spécifiez pas de valeur pour Option Infer dans votre code, la valeur par défaut du compilateur est Option Infer On.

Si la valeur définie pour Option Infer dans un fichier est en conflit avec la valeur définie dans l'IDE ou sur la ligne de commande, la valeur contenue dans le fichier est prioritaire.

Pour plus d’informations, consultez Option Instruction d’inférence et Compiler la page, Concepteur de projet (Visual Basic).

Voir aussi