Tableaux dans Visual Basic

Un tableau est un ensemble de valeurs liées de manière logique, telles que le nombre d'étudiants de chaque niveau scolaire dans un lycée.

Un tableau vous permet de faire référence à ces valeurs connexes par le même nom et d'utiliser un numéro, appelé index ou indice, pour les distinguer. Les valeurs individuelles portent le nom d'éléments du tableau. Elles sont contiguës de l'index 0 jusqu'à la valeur d'index la plus élevée.

Une variable qui contient une valeur unique est appelée variable scalaire.

Exemple

L'exemple suivant déclare une variable tableau devant contenir le nombre d'étudiants de chaque niveau scolaire dans un lycée.

Dim students(6) As Integer

Le tableau students de l'exemple précédent contient 7 éléments. Les index des éléments varient de 0 à 6. Il est plus simple d'utiliser ce tableau que de déclarer 7 variables différentes.

L'illustration suivante représente le tableau students. Pour chaque élément du tableau :

  • l'index de l'élément représente le niveau scolaire (l'index 0 représente le jardin d'enfants) ;

  • la valeur contenue dans l'élément représente le nombre d'étudiants dans ce niveau scolaire.

Éléments du tableau « students »

Image d'un tableau montrant le nombre d'étudiants

L'exemple suivant montre comment faire référence aux premier, deuxième et dernier éléments du tableau students.

Dim kindergarten As Integer = students(0)
Dim firstGrade As Integer = students(1)
Dim sixthGrade As Integer = students(6)
MsgBox("Students in kindergarten = " & CStr(kindergarten))
MsgBox("Students in first grade = " & CStr(firstGrade))
MsgBox("Students in sixth grade = " & CStr(sixthGrade))

Vous pouvez faire référence au tableau dans son ensemble en utilisant uniquement le nom de variable tableau sans index.

Dimensions d'un tableau

Le tableau students de l'exemple précédent utilise un index et est unidimensionnel. Un tableau qui utilise plusieurs index ou indices est multidimensionnel. Pour plus d'informations, consultez Dimensions du tableau dans Visual Basic.

Un autre genre de tableau est un tableau qui contient d'autres tableaux comme éléments. On appelle cela un tableau de tableaux ou un tableau en escalier. Un tableau en escalier peut être unidimensionnel ou multidimensionnel, comme peuvent l'être ses éléments. La structure de données de votre application est parfois à deux dimensions, mais pas rectangulaire. Vous pouvez par exemple posséder un tableau des mois dont chacun des éléments est un tableau des jours. Puisque des mois distincts possèdent un nombre de jours différent, les éléments ne constituent pas un tableau rectangulaire à deux dimensions. Dans ce cas, vous pouvez utiliser un tableau en escalier au lieu d'un tableau multidimensionnel.

Déclaration d'un tableau

Vous pouvez déclarer des variables tableau de la même façon que les autres variables, à l'aide de l'instruction Dim. Le nom de la variable est suivi d'une ou plusieurs paires de parenthèses pour indiquer qu'elle contient un tableau et non une variable scalaire (une variable contenant une valeur unique).

Pour déclarer une variable tableau de type unidimensionnel, ajoutez une paire de parenthèses après le nom de la variable.

Dim cargoWeights() As Double

Pour déclarer une variable tableau de type multidimensionnel, ajoutez une paire de parenthèses après le nom de la variable et insérez des virgules dans les parenthèses pour séparer les dimensions.

Dim atmospherePressures(,,,) As Short

Pour déclarer une variable tableau en escalier, ajoutez le même nombre de paires de parenthèses après le nom de la variable que de niveaux de tableaux imbriqués.

Dim inquiriesByYearMonthDay()()() As Byte

Les exemples précédents montrent comment déclarer des variables tableau, mais aucun tableau n'est assigné à ces dernières. Vous devez encore créer un tableau, l'initialiser et l'assigner à la variable.

Tableaux de longueur zéro

Un tableau sans éléments est également appelé un tableau de longueur zéro. Une variable contenant un tableau de longueur zéro n'a pas la valeur Nothing. Pour créer un tableau ne comportant pas d'éléments, déclarez -1 pour l'une des dimensions du tableau, comme indiqué dans l'exemple suivant.

Dim twoDimensionalStrings(-1, 3) As String

Vous devrez peut-être créer un tableau de longueur zéro dans les circonstances suivantes :

  • Votre code doit accéder aux membres de la classe Array, tels que Length ou Rank, ou appeler une fonction Visual Basic telle que UBound, sans risquer une exception NullReferenceException.

  • Vous devez veiller à une plus grande simplification du code utilisateur sans avoir à vérifier Nothing comme un cas particulier.

  • Votre code interagit avec une interface de programmation d'applications (API) qui requiert que vous passiez un tableau de longueur zéro à une ou plusieurs procédures, ou qui retourne un tableau de longueur zéro d'une ou plusieurs procédures.

Création d'un tableau

Un tableau peut être créé de deux façons. Vous pouvez indiquer la taille d'un tableau lorsqu'il est déclaré, ou, étant donné qu'un tableau est un objet, vous pouvez le créer avec une clause New, opérateur (Visual Basic) et l'assigner à la variable tableau. Cette opération peut être effectuée dans le cadre de la déclaration de tableau ou dans une instruction d'assignation ultérieure, comme indiqué dans l'exemple suivant.

cargoWeights = New Double() {}
atmospherePressures = New Short(,,,) {}
inquiriesByYearMonthDay = New Byte()()() {}

Après l'exécution de ces instructions, la longueur des tableaux est de 0.

Notes

La clause New doit spécifier le nom de type, suivi de parenthèses, puis d'accolades ({}). Les parenthèses ne représentent pas un appel à un constructeur de tableau. Au contraire, elles indiquent que le type d'objet est un type tableau. Vous pouvez indiquer des valeurs d'initialisation à l'intérieur des accolades. Le compilateur requiert les accolades même si vous ne fournissez pas de valeurs. Par conséquent, la clause New doit inclure à la fois les parenthèses et les accolades, même si elles ne contiennent aucune valeur. Si vous excluez les accolades, le compilateur suppose que vous appelez le constructeur correspondant au type spécifié.

Vous pouvez définir la taille d'un tableau de plusieurs façons. Vous pouvez spécifier la taille lorsque le tableau est déclaré, comme indiqué dans l'exemple suivant.

Dim cargoWeights(10) As Double
Dim atmospherePressures(2, 2, 4, 10) As Short
Dim inquiriesByYearMonthDay(20)()() As Byte

Vous pouvez également spécifier la taille d'un tableau lorsqu'il est créé à l'aide d'une clause New, comme indiqué dans l'exemple suivant.

cargoWeights = New Double(10) {}
atmospherePressures = New Short(2, 2, 4, 10) {}
inquiriesByYearMonthDay = New Byte(20)()() {}

Si vous disposez déjà d'un tableau, vous pouvez redéfinir sa taille à l'aide de l'instruction Redim. Vous pouvez spécifier que l'instruction Redim conserve les valeurs actuellement stockées dans le tableau ou qu'elle crée un tableau vide. L'exemple suivant illustre différentes façons d'utiliser l'instruction Redim pour modifier la taille d'un tableau existant.

' Assign a new array size and retain the current element values.
ReDim Preserve cargoWeights(20)
' Assign a new array size and retain only the first five element values.
ReDim Preserve cargoWeights(4)
' Assign a new array size and discard all current element values.
ReDim cargoWeights(15)

Pour plus d'informations, consultez ReDim, instruction (Visual Basic).

Remplissage d'un tableau avec des valeurs initiales

Vous pouvez créer un tableau qui contient un ensemble initial de valeurs à l'aide d'un littéral de tableau. Un littéral de tableau se compose d'une liste de valeurs séparées par des virgules et placées entre accolades ({}).

Lorsque vous créez un tableau à l'aide d'un littéral de tableau, vous pouvez indiquer le type de tableau ou le déterminer au moyen de l'inférence de type. Les deux options sont illustrées dans le code suivant.

Dim numbers = New Integer() {1, 2, 4, 8}
Dim doubles = {1.5, 2, 9.9, 18}

Lorsque vous utilisez l'inférence de type, le type du tableau est déterminé par le type dominant dans la liste de valeurs qui est fournie pour le littéral de tableau. Le type dominant est un type unique auquel tous les autres types présents dans le littéral de tableau peuvent s'étendre. Si ce type unique ne peut pas être déterminé, le type dominant est le type unique auquel tous les autres types du tableau peuvent se limiter. Si aucun de ces types uniques ne peut être déterminé, le type dominant est Object. Par exemple, si la liste de valeurs qui est fournie au littéral de tableau contient des valeurs de type Integer, Long et Double, le tableau résultant est de type Double. Integer et Long s'étendent à Double et uniquement à Double. Par conséquent, Double est le type dominant. Pour plus d'informations, consultez Conversions étendues et restrictives (Visual Basic). Ces règles d'inférence s'appliquent aux types déduits pour les tableaux qui sont des variables locales définies dans un membre de classe. Bien que vous puissiez employer des littéraux de tableaux lorsque vous créez des variables au niveau de la classe, vous ne pouvez pas utiliser l'inférence de type au niveau de la classe. Par conséquent, les littéraux de tableaux spécifiés au niveau de la classe déduisent les valeurs fournies pour le littéral de tableau en tant que type Object.

Vous pouvez spécifier explicitement le type des éléments d'un tableau qui est créé à l'aide d'un littéral de tableau. Dans ce cas, les valeurs présentes dans le littéral de tableau doivent s'étendre au type des éléments du tableau. L'exemple de code suivant permet de créer un tableau de type Double à partir d'une liste d'entiers.

Dim values As Double() = {1, 2, 3, 4, 5, 6}

Littéraux de tableaux imbriqués

Vous pouvez créer un tableau multidimensionnel à l'aide des littéraux de tableaux imbriqués. Les littéraux de tableaux imbriqués doivent avoir une dimension et un nombre de dimensions, ou rang, qui est cohérent avec le tableau résultant. L'exemple de code suivant permet de créer un tableau d'entiers à deux dimensions à l'aide d'un littéral de tableau.

Dim grid = {{1, 2}, {3, 4}}

Dans l'exemple précédent, une erreur se produit si le nombre d'éléments présents dans les littéraux de tableaux imbriqués ne correspond pas. Une erreur survient également si la variable tableau a été déclarée explicitement en tant que type autre que le type à deux dimensions.

Notes

Vous pouvez éviter une erreur lorsque vous indiquez des littéraux de tableaux imbriqués de dimensions différentes en plaçant les littéraux de tableaux internes entre parenthèses. Les parenthèses forcent l'évaluation de l'expression de littéral de tableau et les valeurs résultantes sont utilisées avec le littéral de tableau externe. Cela est illustré dans le code suivant.

Dim values = {({1, 2}), ({3, 4, 5})}

Lorsque vous créez un tableau multidimensionnel à l'aide des littéraux de tableaux imbriqués, vous pouvez utiliser l'inférence de type. Lorsque vous employez l'inférence de type, le type déduit est le type dominant pour l'ensemble des valeurs de tous les littéraux de tableaux d'un niveau d'imbrication. L'exemple de code suivant permet de créer un tableau à deux dimensions de type Double à partir de valeurs de types Integer et Double.

Dim a = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

Pour obtenir d'autres exemples, consultez Comment : initialiser les variables tableau en Visual Basic.

Stockage de valeurs dans un tableau

Dans un tableau, vous pouvez accéder à chaque emplacement à l'aide d'un index de type Integer. Vous pouvez stocker des valeurs dans un tableau et en récupérer en référençant chaque emplacement de tableau à l'aide de son index, placé entre parenthèses. Les index des tableaux multidimensionnels sont séparés par des virgules (,). Vous avez besoin d'un index pour chaque dimension de tableau. L'exemple suivant montre quelques instructions qui stockent des valeurs dans des tableaux.

Dim i = 4
Dim j = 2

Dim numbers(10) As Integer
Dim matrix(5, 5) As Double

numbers(i + 1) = 0
matrix(3, j * 2) = j

L'exemple suivant montre des instructions qui obtiennent des valeurs à partir de tableaux.

Dim v = 2
Dim i = 1
Dim j = 1
Dim k = 1
Dim wTotal As Double = 0.0
Dim sortedValues(5), rawValues(5), estimates(2, 2, 2) As Double
Dim lowestValue = sortedValues(0)
wTotal += (rawValues(v) ^ 2)
Dim firstGuess = estimates(i, j, k)

Pour chaque dimension de tableau, la méthode GetUpperBound retourne la valeur la plus élevée que l'index peut comporter. La valeur d'index la plus basse est toujours 0.

Taille de tableau

La taille d'un tableau est le produit des longueurs de toutes ses dimensions. Elle représente le nombre total d'éléments contenus actuellement dans le tableau.

L'exemple suivant déclare un tableau à trois dimensions.

Dim prices(3, 4, 5) As Long

La taille globale du tableau dans la variable prices est (3 + 1) x (4 + 1) x (5 + 1) = 120.

Vous pouvez rechercher la taille d'un tableau à l'aide de la propriété Length. Vous pouvez rechercher la longueur de chaque dimension d'un tableau multidimensionnel à l'aide de la méthode GetLength.

Vous pouvez redimensionner une variable tableau en lui assignant un nouvel objet tableau ou en utilisant l'instruction ReDim.

Il convient de prendre en compte les facteurs suivants.

Longueur de dimension

L'index de chaque dimension est basé sur 0, ce qui signifie qu'il varie de 0 à sa limite supérieure. Par conséquent, la longueur d'une dimension donnée est égale à la limite supérieure déclarée pour cette dimension plus 1.

Limites de longueurs

La longueur de chaque dimension d'un tableau est limitée à la valeur maximale du type de données Integer, qui est (2 ^ 31) - 1. Toutefois, la taille totale d'un tableau est limitée également par la mémoire disponible sur votre système. Si vous essayez d'initialiser un tableau qui dépasse la quantité de mémoire vive disponible, le Common Language Runtime lève une exception OutOfMemoryException.

Taille et taille d'élément

La taille d'un tableau est indépendante du type de données de ses éléments. La taille représente toujours le nombre total d'éléments, et non le nombre d'octets de stockage qu'ils consomment.

Consommation de mémoire

Il n'est pas prudent de faire des suppositions quant à la manière dont un tableau est stocké en mémoire. Le stockage varie sur les plateformes de largeurs de données différentes, par conséquent le même tableau peut consommer plus de mémoire sur un système 64 bits que sur un système 32 bits. Selon configuration du système lorsque vous initialisez un tableau, le Common Language Runtime (CLR) peut assigner le stockage de façon à comprimer le plus possible les éléments ou à tous les aligner sur des limites matérielles naturelles. De plus, un tableau requiert une charge de stockage pour ses informations de contrôle et cette charge augmente avec chaque dimension ajoutée.

Types tableau et autres types

Types de données

Chaque tableau comporte un type de données, qui diffère du type de données de ses éléments. Il n'existe pas de type de données unique pour tous les tableaux. Au lieu de cela, le type de données d'un tableau est déterminé par le nombre de dimensions, ou rang, du tableau, et le type de données des éléments du tableau. Deux variables tableau sont considérées comme correspondant au même type de données uniquement si elles ont le même rang et que leurs éléments ont le même type de données. Les longueurs des dimensions d'un tableau n'influencent pas le type de données du tableau.

Chaque tableau hérite de la classe System.Array et vous pouvez déclarer une variable comme étant de type Array, mais vous ne pouvez pas créer de tableau de type Array. De plus, l'ReDim, instruction (Visual Basic) ne peut pas fonctionner sur une variable déclarée comme type Array. Pour ces raisons, et pour la sécurité de type, il est recommandé de déclarer chaque tableau en tant que type spécifique, tel que Integer dans l'exemple précédent.

Vous pouvez déterminer le type de données d'un tableau ou de ses éléments de plusieurs manières.

  • Vous pouvez appeler la méthode Object.GetType sur la variable de façon à recevoir un objet Type pour le type de la variable à l'exécution. L'objet Type contient des informations complètes dans ses propriétés et méthodes.

  • Vous pouvez passer la variable à la fonction TypeName pour recevoir un élément String contenant le nom du type à l'exécution.

  • Vous pouvez passer la variable à la fonction VarType pour recevoir une valeur VariantType représentant la classification de type de la variable.

L'exemple suivant appelle la fonction TypeName pour déterminer le type du tableau et celui de ses éléments. Le type du tableau est Integer(,) et le type de ses éléments est Integer.

Dim thisTwoDimArray(,) As Integer = New Integer(9, 9) {}
MsgBox("Type of thisTwoDimArray is " & TypeName(thisTwoDimArray))
MsgBox("Type of thisTwoDimArray(0, 0) is " & TypeName(thisTwoDimArray(0, 0)))

Les collections en tant qu'alternative aux tableaux

Bien que les collections soient le plus souvent utilisées avec le type de données Object (Object, type de données), vous pouvez les employer avec n'importe quel type de données. Parfois, il peut être plus efficace d'enregistrer des éléments dans une collection plutôt que dans un tableau.

Si vous devez modifier la taille d'un tableau, vous devez utiliser l'ReDim, instruction (Visual Basic). Dans ce cas, Visual Basic crée un tableau et libère le tableau précédent pour qu'il soit supprimé. Cela nécessite un temps d'exécution. Par conséquent, si le nombre d'éléments avec lesquels vous travaillez change fréquemment ou si vous ne pouvez pas prévoir le nombre maximal d'éléments dont vous aurez besoin, vous pourriez obtenir des performances supérieures en utilisant une collection.

Une collection, qui n'est pas obligée de créer de nouvel objet ni de copier d'éléments existants, peut gérer le redimensionnement en moins de temps d'exécution qu'un tableau, qui doit utiliser ReDim. Mais si la taille ne change pas ou change rarement, il est probable qu'un tableau constitue une solution plus efficace. Comme toujours, les performances dépendent beaucoup de l'application. Il vaut souvent la peine d'essayer à la fois un tableau et une collection.

Collections spécialisées

Le .NET Framework fournit également diverses classes, interfaces et structures pour les collections générales et spéciales. Les espaces de noms System.Collections et System.Collections.Specialized contiennent des définitions et des implémentations qui incluent des dictionnaires, des listes, des files d'attente et des piles. L'espace de noms System.Collections.Generic fournit une grande partie de ceux-ci dans des versions génériques, qui prennent un ou plusieurs arguments de type.

Si votre collection doit contenir des éléments d'un seul type de données spécifique, une collection générique offre l'avantage de mettre en vigueur la sécurité de type. Pour plus d'informations sur les types génériques, consultez Types génériques en Visual Basic (Visual Basic).

Collections spécialisées

Le .NET Framework fournit également diverses classes, interfaces et structures pour les collections générales et spéciales. Les espaces de noms System.Collections et System.Collections.Specialized contiennent des définitions et des implémentations qui incluent des dictionnaires, des listes, des files d'attente et des piles. L'espace de noms System.Collections.Generic fournit une grande partie de ceux-ci dans des versions génériques, qui prennent un ou plusieurs arguments de type.

Si votre collection doit contenir des éléments d'un seul type de données spécifique, une collection générique offre l'avantage de mettre en vigueur la sécurité de type. Pour plus d'informations sur les types génériques, consultez Types génériques en Visual Basic (Visual Basic).

Exemple

L'exemple suivant montre comment utiliser la classe générique System.Collections.Generic.List<T> du .NET Framework pour créer une collection de listes d'objets Customer.

' Define the class for a customer.
Public Class Customer
    Public Property Name As String
    ' Insert code for other members of customer structure.
End Class

' Create a module-level collection that can hold 200 elements.
Public CustomerList As New List(Of Customer)(200)

' Add a specified customer to the collection.
Private Sub AddNewCustomer(ByVal newCust As Customer)
    ' Insert code to perform validity check on newCust.
    CustomerList.Add(newCust)
End Sub

' Display the list of customers in the Debug window.
Private Sub PrintCustomers()
    For Each cust As Customer In CustomerList
        Debug.WriteLine(cust)
    Next cust
End Sub

La déclaration de la collection CustomerFile spécifie qu'elle peut contenir uniquement des éléments de type Customer. Elle prévoit également une capacité initiale de 200 éléments. La procédure AddNewCustomer vérifie que le nouvel élément est valide, puis elle l'ajoute à la collection. La procédure PrintCustomers utilise une boucle For Each pour parcourir la collection et afficher ses éléments.

Rubriques connexes

Terme

Définition

Dimensions du tableau dans Visual Basic

Explique le rang et les dimensions des tableaux.

Comment : initialiser les variables tableau en Visual Basic

Décrit comment remplir des tableaux avec des valeurs initiales.

Comment : inverser le contenu d'un tableau dans Visual Basic

Explique comment inverser l'ordre des éléments d'un tableau.

Comment : trier un tableau dans Visual Basic

Montre comment trier alphabétiquement les éléments d'un tableau.

Comment : assigner un tableau à un autre tableau (Visual Basic)

Décrit les règles et les étapes à suivre pour assigner un tableau à une autre variable de tableau.

Comment : remplacer un tableau par un autre tableau (Visual Basic)

Décrit les modifications possibles et comment les effectuer.

Comment : passer un tableau à une procédure ou propriété (Visual Basic)

Explique comment passer un tableau en tant qu'argument à une procédure ou à une propriété.

Comment : retourner un tableau à partir d'une procédure ou propriété (Visual Basic)

Décrit comment retourner un tableau au code qui appelle une procédure ou une propriété.

Dépannage des tableaux (Visual Basic)

Aborde certains problèmes courants qui surviennent lors de l'utilisation des tableaux.

Voir aussi

Référence

Dim, instruction (Visual Basic)

ReDim, instruction (Visual Basic)

Array