Instruction Dim (Visual Basic)

Déclare et alloue l’espace de stockage pour une ou plusieurs variables.

Syntaxe

[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist

Éléments

  • attributelist

    Optionnel. Consultez la Liste des attributs.

  • accessmodifier

    Optionnel. Il peut s'agir d'une des méthodes suivantes :

    Consultez Access levels in Visual Basic.

  • Shared

    Optionnel. Consultez Partagé.

  • Shadows

    Optionnel. Consultez Shadows.

  • Static

    Optionnel. Consultez Statique.

  • ReadOnly

    Optionnel. Consultez ReadOnly.

  • WithEvents

    Optionnel. Spécifie qu’il s’agit de variables objet qui font référence à des instances d’une classe pouvant déclencher des événements. Consultez WithEvents.

  • variablelist

    Obligatoire. Liste des variables déclarées dans cette instruction.

    variable [ , variable ... ]

    Chaque variable emploie la syntaxe et les éléments suivants :

    variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With{[ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]

    Élément Description
    variablename Obligatoire. Nom de la variable. Consultez Declared Element Names.
    boundslist Optionnel. Liste des limites de chaque dimension d’une variable de tableau.
    New Optionnel. Crée une instance de la classe lors de l’exécution de l’instruction Dim.
    datatype Optionnel. Type de données de la variable.
    With Optionnel. Introduit la liste d’initialiseurs d’objets.
    propertyname Optionnel. Nom d’une propriété dans la classe pour laquelle vous créez une instance.
    propinitializer Obligatoire après propertyname =. Expression évaluée et attribuée au nom de la propriété.
    initializer Facultatif si New n’est pas spécifié. Expression évaluée et attribuée à la variable lors de sa création.

Notes

Le compilateur Visual Basic utilise l’instruction Dim pour déterminer le type de données de la variable et d’autres informations, par exemple le code pouvant accéder à la variable. L’exemple suivant déclare une variable pour contenir une valeur Integer.

Dim numberOfStudents As Integer

Vous pouvez spécifier le type de données de votre choix ou le nom d’une énumération, d’une structure, d’une classe ou d’une interface.

Dim finished As Boolean
Dim monitorBox As System.Windows.Forms.Form

Pour un type de référence, vous utilisez le mot clé New pour créer une instance de la classe ou de la structure spécifiée par le type de données. Si vous utilisez New, vous n’utilisez pas d’expression d’initialiseur. Au lieu de cela, vous fournissez les arguments qui sont nécessaires au constructeur de la classe à partir de laquelle vous créez la variable.

Dim bottomLabel As New System.Windows.Forms.Label

Vous pouvez déclarer une variable dans une procédure, un bloc, une classe, une structure ou un module. Vous ne pouvez pas déclarer une variable dans un fichier source, un espace de noms ni une interface. Pour plus d’informations, consultez Contextes de déclaration et niveaux d’accès par défaut.

Une variable déclarée au niveau du module, en dehors de toute procédure, est une variable membre ou un champ. Les variables membres sont dans l’étendue de leur classe, structure ou module. Une variable déclarée au niveau de la procédure est une variable locale. Les variables locales sont dans l’étendue uniquement au sein de leur procédure ou bloc.

Les modificateurs d’accès suivants sont utilisés pour déclarer des variables en dehors d’une procédure : Public, Protected, Friend, Protected Friend et Private. Pour plus d’informations, consultez Niveaux d’accès en Visual Basic.

Le mot clé Dim est facultatif et généralement omis si vous spécifiez l’un des modificateurs suivants : Public, Protected, Friend, Protected Friend, Private, Shared, Shadows, Static, ReadOnly ou WithEvents.

Public maximumAllowed As Double
Protected Friend currentUserName As String
Private salary As Decimal
Static runningTotal As Integer

Si Option Explicit est activé (valeur par défaut), le compilateur nécessite une déclaration pour chaque variable utilisée. Pour plus d’informations, consultez Option Explicit, instruction.

Spécification d’une valeur initiale

Vous pouvez attribuer une valeur à une variable lors de sa création. Pour un type valeur, vous utilisez un initialiseur afin fournir une expression à attribuer à la variable. L’expression doit être évaluée à une constante qui peut être calculée au moment de la compilation.

Dim quantity As Integer = 10
Dim message As String = "Just started"

Si un initialiseur est spécifié et qu’un type de données n’est pas spécifié dans une clause As, l’inférence de type est utilisée pour déduire le type de données à partir de l’initialiseur. Dans l’exemple suivant, num1 et num2 sont fortement typés en tant qu’entiers. Dans la deuxième déclaration, l’inférence de type déduit le type à partir de la valeur 3.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

L’inférence de type s’applique au niveau de la procédure. Elle ne s’applique pas à l’extérieur d’une procédure de classe, de structure, de module ni d’interface. Pour plus d’informations sur l’inférence de type, consultez Instruction Option Infer et Inférence de type de variable locale.

Pour plus d’informations sur le comportement quand un type de données ou un initialiseur n’est pas spécifié, consultez Types de données et valeurs par défaut ultérieurement dans cette rubrique.

Vous pouvez utiliser un initialiseur d’objet pour déclarer des instances de types nommés et anonymes. Le code suivant crée une instance d’une classe Student et utilise un initialiseur d’objet pour initialiser les propriétés.

Dim student1 As New Student With {.First = "Michael",
                                  .Last = "Tucker"}

Pour plus d’informations sur les initialiseurs d’objets, consultez Guide pratique pour déclarer un objet à l’aide d’un initialiseur d’objet, Initialiseurs d’objets : types nommés et anonymes et Types anonymes.

Déclaration de plusieurs variables

Vous pouvez déclarer plusieurs variables dans une instruction de déclaration, en spécifiant le nom de chacune d’elles et en suivant chaque nom de tableau avec les parenthèses. Les variables multiples sont séparées par des virgules.

Dim lastTime, nextTime, allTimes() As Date

Si vous déclarez plusieurs variables avec une clause As, vous ne pouvez pas fournir d’initialiseur pour ce groupe de variables.

Vous pouvez spécifier différents types de données pour différentes variables à l’aide d’une clause As distincte pour chaque variable que vous déclarez. Chaque variable prend le type de données spécifié dans la première clause As rencontrée après la partie variablename.

Dim a, b, c As Single, x, y As Double, i As Integer
' a, b, and c are all Single; x and y are both Double

Tableaux

Vous pouvez déclarer une variable pour contenir un tableau pouvant contenir plusieurs valeurs. Pour spécifier qu’une variable contient un tableau, faites suivre variablename immédiatement de parenthèses. Pour plus d’informations sur les tableaux, consultez Tableaux.

Vous pouvez spécifier la limite inférieure et supérieure de chaque dimension d’un tableau. Pour cela, incluez boundslist entre les parenthèses. Pour chaque dimension, boundslist spécifie la limite supérieure et éventuellement la limite inférieure. La limite inférieure est toujours égale à zéro, que la valeur soit spécifiée ou non. Chaque index peut varier de la valeur zéro à la limite supérieure.

Les deux instructions suivantes sont équivalentes. Chaque instruction déclare un tableau de 21 éléments Integer. Quand vous accédez au tableau, l’index peut varier de la valeur 0 à 20.

Dim totals(20) As Integer
Dim totals(0 To 20) As Integer

L’instruction suivante déclare un tableau à deux dimensions de type Double. Le tableau comporte 4 lignes (3 + 1) de 6 colonnes (5 + 1) chacune. Notez qu’une limite supérieure correspond à la valeur la plus élevée possible pour l’index, et non à la longueur de la dimension. La longueur de la dimension correspond à la limite supérieure plus un.

Dim matrix2(3, 5) As Double

Un tableau peut avoir entre 1 et 32 dimensions.

Vous pouvez laisser toutes les limites vides dans une déclaration de tableau. Si vous procédez ainsi, le tableau a le nombre de dimensions que vous spécifiez, mais il n’est pas initialisé. Il a la valeur Nothing jusqu’à ce que vous initialisiez au moins certains éléments. L’instruction Dim doit spécifier des limites soit pour toutes les dimensions, soit pour aucune dimension.

' Declare an array with blank array bounds.
Dim messages() As String
' Initialize the array.
ReDim messages(4)

Si le tableau comporte plusieurs dimensions, vous devez inclure des virgules entre les parenthèses pour indiquer le nombre de dimensions.

Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte

Vous pouvez déclarer un tableau de longueur nulle en déclarant l’une des dimensions du tableau comme étant -1. Une variable qui contient un tableau de longueur zéro n’a pas la valeur Nothing. Des tableaux de longueur zéro sont requis par certaines fonctions du Common Language Runtime. Si vous essayez d’accéder à ce type de tableau, une exception d’exécution se produit. Pour plus d’informations, consultez Tableaux.

Vous pouvez initialiser les valeurs d’un tableau à l’aide d’un littéral de tableau. Pour cela, entourez les valeurs d’initialisation d’accolades ({}).

Dim longArray() As Long = {0, 1, 2, 3}

Pour les tableaux multidimensionnels, l’initialisation de chaque dimension distincte est placée entre accolades dans la dimension externe. Les éléments sont spécifiés dans l’ordre row-major.

Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}

Pour plus d’informations sur les littéraux de tableaux, consultez Tableaux.

Types de données et valeurs par défaut

Le tableau suivant décrit les résultats des diverses combinaisons de spécification du type de données et d'un initialiseur dans une instruction Dim.

Type de données spécifié ? Initialiseur spécifié ? Exemple Résultats
Non Non Dim qty Si Option Strict est désactivé (par défaut), la valeur est définie sur Nothing.

Si Option Strict est activé, une erreur se produit au moment de la compilation.
Non Oui Dim qty = 5 Si Option Infer est activé (par défaut), la variable prend le type de données de l’initialiseur. Consultez Inférence de type de variable locale.

Si Option Infer est désactivé et que Option Strict est désactivé, la variable prend le type de données de Object.

Si Option Infer est désactivé et que Option Strict est activé, une erreur se produit au moment de la compilation.
Oui Non Dim qty As Integer La variable est initialisée avec la valeur par défaut du type de données. Consultez le tableau ultérieur dans cette section.
Oui Oui Dim qty As Integer = 5 Si le type de données de l’initialiseur ne peut pas être converti dans le type de données spécifié, une erreur se produit au moment de la compilation.

Si vous spécifiez un type de données sans spécifiez d’initialiseur, Visual Basic initialise la variable sur la valeur par défaut de son type de données. Le tableau suivant présente les valeurs d’initialisation par défaut.

Type de données Valeur par défaut
Tous les types numériques (notamment Byte et SByte) 0
Char Binaire 0
Tous les types de référence (notamment Object, String et tous les tableaux) Nothing
Boolean False
Date 12 h 00 le 1er janvier de l’année 1 (01/01/0001 12:00:00)

Chaque élément d’une structure est initialisé comme s’il s’agissait d’une variable distincte. Si vous déclarez la longueur d’un tableau, mais que vous n’initialisez pas ses éléments, chaque élément est initialisé comme s’il s’agissait d’une variable distincte.

Durée de vie des variables locales statiques

Une variable locale Static a une durée de vie plus longue que la procédure dans laquelle elle est déclarée. Les limites de la durée de vie de la variable dépendent de l’emplacement où la procédure est déclarée et de la définition de Shared.

Déclaration de procédure Variable initialisée La variable cesse d’exister
Dans un module La première fois que la procédure est appelée Quand votre programme arrête l’exécution
Dans une classe ou une structure, la procédure est Shared La première fois que la procédure est appelée sur une instance spécifique ou sur la classe ou la structure elle-même Quand votre programme arrête l’exécution
Dans une classe ou une structure, la procédure n’est pas Shared La première fois que la procédure est appelée sur une instance spécifique Quand l’instance est libérée pour le nettoyage de la mémoire (garbage collection)

Attributs et modificateurs

Vous pouvez appliquer des attributs uniquement aux variables membres, pas aux variables locales. Un attribut fournit des informations sur les métadonnées de l’assembly, ce qui n’est pas significatif pour le stockage temporaire comme les variables locales.

Au niveau du module, vous ne pouvez pas utiliser le modificateur Static pour déclarer des variables membres. Au niveau de la procédure, vous ne pouvez pas utiliser Shared, Shadows, ReadOnly, WithEvents ni des modificateurs d’accès pour déclarer des variables locales.

Vous pouvez spécifier le code qui peut accéder à une variable en fournissant un accessmodifier. Les variables membres de classe et de module (en dehors de toute procédure) sont définies par défaut sur l’accès privé, et les variables membres de structure sont définies par défaut sur l’accès public. Vous pouvez ajuster leurs niveaux d’accès avec les modificateurs d’accès. Vous ne pouvez pas utiliser de modificateurs d’accès sur des variables locales (à l’intérieur d’une procédure).

Vous pouvez spécifier WithEvents uniquement sur des variables membres, pas sur des variables locales à l’intérieur d’une procédure. Si vous spécifiez WithEvents, le type de données de la variable doit être un type de classe spécifique, et non Object. Vous ne pouvez pas déclarer un tableau avec WithEvents. Pour plus d’informations sur les événements, consultez Événements.

Notes

Le code en dehors d’une classe, d’une structure ou d’un module doit qualifier le nom d’une variable membre avec le nom de cette classe, structure ou module. Le code en dehors d’une procédure ou d’un bloc ne peut pas faire référence à des variables locales au sein de cette procédure ou bloc.

Libération des ressources managées

Le récupérateur de mémoire (garbage collector, GC) .NET Framework supprime les ressources managées sans codage supplémentaire de votre part. Toutefois, vous pouvez forcer la suppression d’une ressource managée au lieu d’attendre le récupérateur de mémoire.

Si une classe contient une ressource particulièrement précieuse et rare (comme une connexion de base de données ou un handle de fichier), vous ne souhaitez peut-être pas patienter jusqu’à ce que le récupérateur de mémoire suivant nettoie une classe instance qui n’est plus utilisée. Une classe peut implémenter l’interface IDisposable pour fournir un moyen de libérer des ressources avant un nettoyage de la mémoire. Une classe qui implémente cette interface expose une méthode Dispose pouvant être appelée pour forcer la libération immédiate des ressources précieuses.

L’instruction Using automatise le processus d’acquisition d’une ressource, d’exécution d’un ensemble d’instructions, puis de suppression de la ressource. Toutefois, la ressource doit implémenter l’interface IDisposable. Pour plus d’informations, consultez using, instruction.

Exemple 1

L’exemple suivant déclare des variables à l’aide de l’instruction Dim avec différentes options.

' Declare and initialize a Long variable.
Dim startingAmount As Long = 500

' Declare a local variable that always retains its value,
' even after its procedure returns to the calling code.
Static totalSales As Double

' Declare a variable that refers to an array.
Dim highTemperature(31) As Integer

' Declare and initialize an array variable that
' holds four Boolean check values.
Dim checkValues() As Boolean = {False, False, True, False}

Exemple 2

L’exemple suivant répertorie les nombres premiers compris entre 1 et 30. L’étendue des variables locales est décrite dans les commentaires de code.

Public Sub ListPrimes()
    ' The sb variable can be accessed only
    ' within the ListPrimes procedure.
    Dim sb As New System.Text.StringBuilder()

    ' The number variable can be accessed only
    ' within the For...Next block.  A different
    ' variable with the same name could be declared
    ' outside of the For...Next block.
    For number As Integer = 1 To 30
        If CheckIfPrime(number) = True Then
            sb.Append(number.ToString & " ")
        End If
    Next

    Debug.WriteLine(sb.ToString)
    ' Output: 2 3 5 7 11 13 17 19 23 29
End Sub

Private Function CheckIfPrime(ByVal number As Integer) As Boolean
    If number < 2 Then
        Return False
    Else
        ' The root and highCheck variables can be accessed
        ' only within the Else block.  Different variables
        ' with the same names could be declared outside of
        ' the Else block.
        Dim root As Double = Math.Sqrt(number)
        Dim highCheck As Integer = Convert.ToInt32(Math.Truncate(root))

        ' The div variable can be accessed only within
        ' the For...Next block.
        For div As Integer = 2 To highCheck
            If number Mod div = 0 Then
                Return False
            End If
        Next

        Return True
    End If
End Function

Exemple 3

Dans l’exemple suivant, la variable speedValue est déclarée au niveau de la classe. Le mot clé Private est utilisé pour déclarer la variable. La variable est accessible par toute procédure de la classe Car.

' Create a new instance of a Car.
Dim theCar As New Car()
theCar.Accelerate(30)
theCar.Accelerate(20)
theCar.Accelerate(-5)

Debug.WriteLine(theCar.Speed.ToString)
' Output: 45
Public Class Car
    ' The speedValue variable can be accessed by
    ' any procedure in the Car class.
    Private speedValue As Integer = 0

    Public ReadOnly Property Speed() As Integer
        Get
            Return speedValue
        End Get
    End Property

    Public Sub Accelerate(ByVal speedIncrease As Integer)
        speedValue += speedIncrease
    End Sub
End Class

Voir aussi