0% ont trouvé ce document utile (0 vote)
7 vues22 pages

Chaînes de caractères en VB .Net

Le document présente la classe string dans .NET, soulignant son immutabilité et les méthodes disponibles pour manipuler les chaînes de caractères. Il explique également comment déclarer des variables de type string, accéder à leurs caractères, et effectuer des opérations de base comme la concaténation et la recherche de sous-chaînes. Enfin, il aborde les tableaux en VB, leur déclaration, instanciation et gestion en tant qu'objets de type référence.

Transféré par

hicham2655
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
7 vues22 pages

Chaînes de caractères en VB .Net

Le document présente la classe string dans .NET, soulignant son immutabilité et les méthodes disponibles pour manipuler les chaînes de caractères. Il explique également comment déclarer des variables de type string, accéder à leurs caractères, et effectuer des opérations de base comme la concaténation et la recherche de sous-chaînes. Enfin, il aborde les tableaux en VB, leur déclaration, instanciation et gestion en tant qu'objets de type référence.

Transféré par

hicham2655
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Les chaînes de caractères string

La classe string
Le type de données String (chaîne de caractère) est une classe de type référence dans l'espace de
noms System de .NET Framework. Donc une chaîne de type string est un objet qui n'est utilisable
qu'à travers les méthodes de la classe string. Le type string est un alias du type [Link] dans
.NET

Un littéral de chaîne est une suite de caractères entre guillemets : " abcdef " est un exemple
de littéral de String.
Toutefois un objet string de VB est immuable (son contenu ne change pas)
• Etant donné que cette classe est très utilisée les variables de type string bénéficient d'un statut
d'utilisation aussi souple que celui des autres types élémentaires par valeurs. On peut les
considérer comme des listes de caractères Unicode numérotés de 0 à n-1 (si n figure le nombre
de caractères de la chaîne).
• Il est possible d'accéder à chaque caractère de la chaîne en la considérant comme un tableau de
caractères en lecture seule.

Accès à une chaîne string

Déclaration d'une variable String Dim str1 As String


Déclaration d'une variable String avec Dim str1 As String = " abcdef "
initialisation Instancie un nouvel objet : "abcdef "
On accède à la longueur d'une chaîne par la
propriété : Dim str1 As String = "abcdef"
Dim longueur As Integer
Length As Integer longueur = [Link] // ici longueur = 6

On accède à un caractère de rang fixé d'une Dim ch1 As String = "abcdefghijk"


chaîne par l'opérateur ( ) : Représentation interne de l'objet ch1 de type
string :
(la chaîne est lue comme un tableau de char)

Il est possible d'accéder en lecture seulement à


chaque caractères d'une chaîne, mais qu'il est
impossible de modifier un caractère
directement dans une chaîne. Dim car As Char = ch1(4) ;
// ici la variable car contient la lettre 'e'

Remarque
En fait l'opérateur ( ) est une propriété par défaut de genre indexeur de la classe String (cf.
chapitre propriétés en VB), et elle est en lecture seule :

Default Public ReadOnly Property Chars(ByVal index As Integer) As Char


Get

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 1


……
End Get
End Property
Ce qui signifie au stade actuel de compréhension de VB, qu'il est possible d'accéder en
lecture seulement à chaque caractère d'une chaîne, mais qu'il est impossible de modifier un
caractère grâce à l'indexeur.
Dim car As Char = ch1(7) ; // l'indexeur renvoie le caractère 'h' dans la variable car.
ch1(5) = car ; // Erreur de compilation : l'écriture dans l'indexeur est interdite !!
ch1(5) = 'x' ; // Erreur de compilation : l'écriture dans l'indexeur est interdite !!

Opérations de base sur une chaîne String


Le type String possède des méthodes d'insertion, modification et suppression : méthodes Insert,
Copy, Concat,...

Position d'une sous-chaîne à l'intérieur d'une chaîne donnée :


Recherche de la position de ssch dans ch1 :
Méthode surchargée 6 fois :
Dim ch1 As String = " abcdef "
Function IndexOf ( …) As Integer Dim ssch As String ="cde"

Ci-contre une utilisation de la surcharge :

Function IndexOf ( ssch As String) qui


renvoie l'indice de la première occurrence du
String ssch contenue dans la chaîne scannée.
Dim rang As Integer
rang = [Link] ( ssch )
// ici la variable rang vaut 3

Concaténation de deux chaînes


Un opérateur ou une méthode Dim str1,str2,str3 As String
Opérateur : + sur les chaînes str1="bon"
ou str2="jour"
Méthode Shared surchargée 8 fois : str3=str1+str2
Function Concat(…)As String
Les deux écritures ci-dessous sont donc
équivalentes en VB :
str3 = str1+str2
Ù
str3 = [Link](str1,str2)

Insertion d'une chaîne Soit :


dans
une autre chaîne

Appel de la méthode Insert de la chaîne ch1


afin de construire une nouvelle chaîne ch2 qui

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 2


est une copie de ch1 dans laquelle on a inséré
une sous-chaîne, ch1 n'a pas changé
(immuabilité).
ch1 et ch2 sont deux chaînes :
Dim ch1,ch2 As String

Puis invocation de la méthode Insert sur ch1 :

ch2 est une copie de ch1 dans laquelle on a


inséreré la sous-chaîne "..x..".

Attention :
Les méthodes (procédures ou fonctions) d'insertion, suppression, etc…ne modifient pas la
chaîne objet qui invoque la méthode mais renvoient un autre objet de chaîne différent,
obtenu après action de la méthode sur l'objet initial.

Convertir une chaîne String en tableau de caractères


Si l'on souhaite se servir d'une String comme un tableau de Char, il faut utiliser la méthode
ToCharArray qui convertit la chaîne en un tableau de caractères contenant tous les caractères de la
chaîne.
Function ToCharArray As Char ()

Soient les lignes de programme suivantes :


Dim str1 As String = "abcdef"
Dim tCarac As Char ( )
tCarac = [Link]( )
tCarac = "abcdefghijk".ToCharArray( )

Illustrons ces lignes par des schémas de références :

Dim str1 As String = "abcdef"

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 3


Dim tCarac As Char ( )
tCarac = [Link]( )

tCarac = "abcdefghijk".ToCharArray( );

Opérateurs d'égalité et d'inégalité de string


L'opérateur d'égalité = , détermine si deux objets string spécifiés ont la même valeur, il se
comporte comme sur des éléments de type de base (int, char,...)
Dim a, b As String
(a = b ) renvoie true si la valeur de a est la même que la valeur de b ; sinon il renvoie false.
Public Shared Operator = ( ByVal a As String, ByVal b As String) As Boolean
Cet opérateur est surchargé et donc il compare les valeurs effectives des chaînes et non leur
références, il fonctionne comme la méthode public bool Equals( string value ) de la classe string,
qui teste l'égalité de valeur de deux chaînes.
Voici un morceau de programme qui permet de tester l'opérateur d'égalité = et la méthode Equals :
Dim s1, s2, s3, ch As String
ch = "abcdef"
s1 = ch
s2 = "abcdef"
s3 = New String("abcdef".ToCharArray( ))

[Link]("s1=" + s1)
[Link]("s2=" + s2)
[Link]("s3=" + s3)
[Link]("ch=" + ch)
If s2 = ch Then
Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 4
[Link]("s2=ch")
Else
[Link]("s2<>ch")
End If
If s2 = s3 Then
[Link]("s2=s3")
Else
[Link]("s2<>s3")
End If
If s3 = ch Then
[Link]("s3=ch")
Else
[Link]("s3<>ch")
End If
If [Link](ch) Then
[Link]("s3 égal ch")
Else
[Link]("s3 différent de ch")
End If
Après exécution on obtient :
s1=abcdef
s2=abcdef
s3=abcdef
ch=abcdef
s2=ch
s2=s3
s3=ch
s3 égal ch

POUR LES HABITUES DE JAVA : ATTENTION


L'opérateur d'égalité = = en Java n'est pas surchargé, il ne fonctionne pas totalement de la
même façon que l'opérateur = en VB, car il ne compare que les références. Donc des
programmes en apparence syntaxiquement identiques dans les deux langages, peuvent
produire des résultats d'exécution différents :

Programme Java Programme VB


String ch; Dim ch As String
ch = "abcdef" ; ch = "abcdef"

String s2,s1="abc" ; Dim s2 As String, s1As String ="abc"


s2 = s1+"def"; s2 = s1+"def"
//-- tests d'égalité avec l'opérateur = = '-- tests d'égalité avec l'opérateur =
if( s2 == "abcdef" ) [Link] If s2 = "abcdef" Then
("s2==abcdef"); [Link]("s2==abcdef")
else [Link] ("s2<>abcdef"); Else
if( s2 == ch ) [Link] [Link]("s2<>abcdef")
("s2==ch"); End If
else [Link] ("s2<>ch"); If s2 = ch Then
[Link]("s2==ch")
Else
[Link]("s2<>ch")
End If
Résultats d'exécution du code Java : Résultats d'exécution du code VB :
Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 5
s2<>abcdef s2==abcdef
s2<>ch s2==ch

String et Char sont compatibles


Une chaîne string contient des éléments de base de type char, comment passe-t-on de l'un à l'autre
type ?
VB considère un Char comme un cas particulier de String, le transtypage est automatiquement
effectué par VB, ce qui simplifie considérablement l'écriture des programmes :

Dim car As Char = "r"


Dim s As String
s = car
car = s(0)

Code ASCII d'un Char


La fonction Asc convertit un caractère en un entier compris entre 0 et 255 qui est égal au code
ASCII du caractère :

Function Asc(ByVal String As Char) As Integer


Exemple : Asc ( "a" ) vaut l'entier 97

La fonction Chr convertit un entier compris entre 0 et 255 en le caractère de code ASCII
correspondant :

Function Chr(ByVal CharCode As Integer) As Char


Exemple : Chr ( 97 ) vaut le caractère "a"

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 6


Tableaux et matrices

Généralités sur les tableaux


Dès que l'on travaille avec de nombreuses données homogènes ( de même type) la première
structure de base permettant le regroupement de ces données est le tableau. VB comme tous les
langages algorithmiques propose cette structure au programmeur. Comme pour les String et pour
des raisons d'efficacité dans l'encombrement mémoire, les tableaux sont gérés par VB, comme des
objets de type référence (donc sur le tas), leur type hérite de la classe abstraite [Link].
Les tableaux VB sont indexés uniquement par des entiers (Integer, Long,…) et sur un intervalle
fixe à partir de zéro. Un tableau VB peut avoir de une ou à plusieurs dimensions, nous avons donc
les variétés suivantes de tableaux dans le CLR :

Tableaux à une dimension.


Tableaux à plusieurs dimensions (matrices,…) comme en Delphi.
Tableaux déchiquetés comme en C# et Java.

Chaque dimension d'un tableau en VB est définie par une valeur ou longueur, qui est un nombre ou
une variable N entier (char, int, long,…) dont la valeur est supérieur ou égal à zéro. Lorsqu'une
dimension a une longueur N, l'indice associé varie dans l'intervalle [ 0 , N – 1 ].

Tableau uni-dimensionnel
Ci-dessous un tableau 'tab' à une dimension, de n+1 cellules numérotées de 0 à n :

• Les tableaux VB contiennent comme en Delphi, des objets de types quelconques de VB


(type référence ou type valeur).
• Il n'y a pas de mot clef spécifique pour la classe tableaux, mais l'opérateur symbolique (
) indique qu'une variable de type fixé est un tableau.
• La taille d'un tableau doit obligatoirement avoir été définie avant que VB accepte que
vous l'utilisiez !

Remarque :

Les tableaux de VB sont des objets d'une classe dénommée Array qui est la classe de base
d'implémentation des tableaux dans le CLR de .NET framework (localisation : [Link])
Cette classe n'est pas dérivable pour l'utilisateur : " Public MustInherit Class Array Implements
: ICloneable, IList, ICollection, IEnumerable".
C'est en fait le compilateur qui est autorisé à implémenter une classe physique de tableau. Il
faut utiliser les tableaux selon la démarche ci-dessous en sachant que l'on dispose en plus des
propriétés et des méthodes de la classe Array si nécessaire (longueur, tri, etc...)

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 7


Déclaration d'une variable de tableau, référence seule:
Dim table1 As Integer( )
Dim table2 As Char( )
Dim table3 As Single( )

Dim tableStr As String( )

Voici une image de ce qui est présent en mémoire centrale après ces déclarations :

La taille d'un tableau doit obligatoirement avoir été définie avant toute utilisation sous peine d'une
erreur indiquant que l'on utilise une réfrence qui ne pointe vers aucun objet. Ci-dessous la tentative
d'affecter la valeur 8 à la première cellule de rang 0 du tableau "table" échoue, car seule la variable
"table" a été déclarée en tant que référence, mais elle ne pointe vers aucun tableau effectif :

Déclarationet instanciation d'une variable de tableau de taille nulle :


Dim table1 As Integer( ) = New Integer( ) {}
Dim table2 As Char( ) = New Char( ) {}
Dim table3 As Single( ) = New Single( ) {}

Dim tableStr As String( ) = New String( ) {}

Voici une image de ce qui est présent en mémoire centrale après ces déclarations :

Chaque variable de reférence pointe vers un tableau de longueur nulle.

Déclaration d'une variable de tableau avec définition explicite de taille :


Dim table1 As Integer( ) = New Integer(4) {}
Dim table2 As Char( ) = New Char(4) {}
Dim table3 As Single( ) = New Single(4) {}

Dim tableStr As String( ) = New String(4) {}

Soit d'une manière générale ( n est une expression numérique entière):


Dim table As Integer( ) = New Integer( n ) {}
Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 8
La valeur "n" entre parenthèse indique la borne maximale que peut prendre l'indice du tableau,
comme zéro est la valeur minimale que peut prendre cet l'indice, le tableau a donc "n+1" cellules.

Le mot clef New correspond à la création d'un nouveau tableau (en fait un nouvel objet) dont la
taille est fixée par la valeur indiquée entre les crochets. Ici 4 tableaux sont crées et prêts à être
utilisés : table1 contiendra 5 entiers 32 bits, table2 contiendra 5 caractères, table3 contiendra 5 réels
en simple précision et tableStr contiendra 5 chaînes de type string.

On peut aussi déclarer un tableau sous la forme de deux instructions : une instruction de déclaration
et une instruction de définition de taille avec le mot clef New, la seconde pouvant être mise
n'importe où dans le corps d'instruction, mais elle doit être utilisée avant toute manipulation du
tableau. Cette dernière instruction de définition peut être répétée plusieurs fois dans le programme,
il s'agira alors à chaque fois de la création d'un nouveau tableau (donc un nouvel objet), l'ancien
étant détruit et désalloué automatiquement par le ramasse-miettes (garbage collector) de VB.

Dim table1 As Integer( )


Dim table2 As Char( )
Dim table3 As Single( )
Dim tableStr As String( )

table1 = New Integer(4) {}
table2 = New Char(4) {}
table3 = New Single(4) {}
tableStr = New String(4) {}

Voici une image de ce qui est présent en mémoire centrale après ces déclarations :

Chaque variable de reférence pointe vers un tableau de longueur 5, chaque cellule d'un tableau est
automatiquement initialisée par la valeur Nothing qui dépend du type (Nothing = 0 pour un
Integer, Nothing = null pour une String, …).

Raccourcis d'écriture
Les déclarations ci-dessous sont équivalentes :
Dim table(4) As Integer Dim table As Integer( ) Dim table As Integer( ) = New Integer(4) {}
table1 = New Integer(4) {}

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 9


Bien que la première écriture soit la plus simple, l'utilisation de l'écriture avec le mot clef New est
conseillée pour bien prendre conscience qu'un tableau est un objet et que l'on peut affecter un
nouveau tableau de taille différente à la variable table.

Déclaration et initialisation avec définition implicite de taille :


Dim table1 As Integer( ) = New Integer( ){17,-9,4,3,57}
Dim table2 As Char( ) = New Char( ) {"a", "j", "k", "m", "z"}
Dim table3 As Single( ) = New Single( ){-15.7f, 75, -22.03f, 3 ,57 }
Dim tableStr As String( ) = New String( ) {"chat","chien","souris","rat","vache"}

Dans cette éventualité VB crée le tableau, calcule sa taille et l'initialise avec les valeurs fournies.

Ou bien l'initialisation a lieu en deux étapes (déclaration, puis plus loin initialisation)
Dim table1 As Integer( )
Dim table2 As Char( )
Dim table3 As Single( )
Dim tableStr As String( )

table1 = New Integer( ) {17, -9, 4, 3, 57} ' taille = 5
table2 = New Char( ) {"a", "j", "k", "m", "z"} ' taille = 5
table3 = New Single( ) {-15.7f, 75, -22.03f, 3, 57}' taille = 5
tableStr = New String( ) {"chat","chien","souris","rat","vache"} ' taille = 5

Voici une image de ce qui est présent en mémoire centrale après ces instructions :

Il existe en VB un attribut de la classe abstraite mère Array, qui contient


la taille d'un tableau uni-dimensionnel, quelque soit son type, c'est la
propriété Length en lecture seule.
Exemple :
Dim table1 As Integer( ) = New Integer( ){17,-9,4,3,57}
Dim taille As Integer
taille = [Link] // taille = 5

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 10


Il est possible de déclarer une référence de tableau, puis de l'initialiser plusieurs fois :
Dim table1 As Integer( ) ' crée une référence table1 de type tableau de type Integer
table1 = New Integer( ) {17, -9, 4, 3, 57} ' table1 référence un tableau à 5 éléments

table1 = New Integer( ) {5, 0, 8} ' table1 référence maintenant un tableau à 3 éléments


table1 = New Integer( ) {1, 2, 3, 4} ' table1 référence maintenant un tableau à 4 éléments

Les cellules du tableau précédent sont perdues dès que l'on instancie table1 vers un nouveau
tableau, leurs emplacements en mémoire centrale sont rendus au système de gestion de la
mémoire (Garbage Collector).

Utiliser un tableau
Un tableau en VB comme dans les autres langages algorithmiques s'utilise à travers une cellule de
ce tableau repérée par un indice obligatoirement de type entier ou un char considéré comme un
entier (Byte, Short, Integer, Long …). Le premier élément d'un tableau est numéroté 0, le dernier
Length-1.

On peut ranger des valeurs ou des expressions du type général du tableau dans une cellule du
tableau.

Exemple avec un tableau de type Integer :

Dim table0 As Integer( ) = New Integer (5 ){}


' dans une instruction d'affectation:
table0( 0 ) = -458
table0( 4 ) = 5891
table0( 6 ) = 72 '<--- est une erreur de dépassement de la taille ! (valeur entre 0 et 5)

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 11


' dans une instruction de boucle:
For i As Integer = 0 To [Link]-1
table0(i) = 3*i-1 ' après la boucle: table1 = {-1,2,5,8,11}
Next

Même exemple avec un tableau de type Char :

Dim table2 As Integer( ) = New Integer (5 ){}


table2(0) = "?"
table2(4) = "a"
table2(14) = "#" '<--- est une erreur de dépassement de la taille
For i As Integer = 0 To [Link]-1
table2(i) = Chr(Asc("a") + i)
Next
// après la boucle: table2 = {'a', 'b', 'c' ,'d', 'e', 'f'}

Remarque :
Dans une classe exécutable la méthode Main reçoit en paramètre un tableau
de String nommé args qui correspond en fait aux éventuels paramètres de
l'application elle-même:
Sub Main( ByVal args As String( ) )

Affectation de tableaux, recopie de tableaux


Un tableau est une reférence pointant vers un ensemble de cellules en mémoire centrale (c'est un
objet), il est tout à fait possible d'effectuer une affectation entre deux variables de tableaux de même
type mais de taille égale ou différente, il ne s'agit alors pas d'une recopie de tableaux : ce sont en fait
les pointeurs qui sont recopiés l'un dans l'autre par l'affectation et non pas les tableaux eux-mêmes.

Instruction Image en mémoire centrale

Dim table1(8) As Integer


Dim table2(5) As Integer

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 12


table2 = table1

Après l'affectation : table1 et table2 pointent vers le même


ensemble de cellules (le même tableau)

Toute modification sur table1 ou table2 a lieu sur les mêmes cellules :
Instructions Image en mémoire centrale
Dim table1(8) As Integer
Dim table2(5) As Integer

For k As Integer = 0 To 8
table1(k) = k * 10
Next
For k As Integer = 0 To 5
table2(k) = k
Next

table2 = table1

table1 et table2 maintenant se refèrent à la même entité.

table2(4) = -1

Donc table1(4) vaut aussi "-1", car il pointe vers le même tableau
qui ne se trouve qu'en un seul exemplaire en mémoire centrale.

Si l'on veut recopier un tableau uni-dimensionnel et en avoir deux exemplaires en mémoire,


l'affectation ne le permet pas, il faut alors utiliser la méthode-procédure CopyTo(…) de la classe

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 13


Array en lui passant comme paramètre le tableau de destination et en démarrant l'index de copie à la
valeur 0.

En reprenant les tableaux précédents :

Instruction Image en mémoire centrale


Dim table1(8) As Integer
Dim table2(5) As Integer
For k As Integer = 0 To 8
table1(k) = k * 10
Next
For k As Integer = 0 To 5
table2(k) = k
Next

[Link](table2,0)

Cette instruction crée un nouveau tableau pointé par table2 qui


l'exacte copie de celui pointé par table1.

table2(4) = -1

La modification de la cellule de rang 4 dans table2 n'a aucune


influence sur table1 puisque ce sont deux entités bien distinctes.

Les matrices et les tableaux multi-dimensionnels


Les tableaux VB peuvent avoir plusieurs dimensions, ceux qui ont deux dimensions sont dénommés
matrices (vocabulaire scientifique). Tous ce que nous allons dire sur les matrices s'étend ipso facto
aux tableaux de dimensions trois, quatre et plus. Ce sont aussi des objets et ils se comportent
comme les tableaux à une dimension tant au niveau des déclarations qu'au niveau des utilisations.
La déclaration s'effectue avec un opérateur parentèse et des virgules, exemples d'une syntaxe de

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 14


déclaration d'un tableau à trois dimension : ( , , ) . Leur structuration est semblable à celle des
tableaux Delphi-pascal.

Déclaration d'une matrice, référence seule:


Dim table1 As Integer( , )
Dim table2 As Char( , )
Dim table3 As Single( , )

Dim tableStr As String( , )

Déclarationet instanciation d'une variable de matrice de taille nulle :


Dim table1 As Integer( , ) = New Integer( , ) {}
Dim table2 As Char( , ) = New Char( , ) {}
Dim table3 As Single( , ) = New Single( , ) {}

Dim tableStr As String( , ) = New String( , ) {}

Déclaration d'une matrice avec définition explicite de taille :


Dim table1 As Integer( , ) = New Integer(5, 2) {}
Dim table2 As Char( , ) = New Char(1 ,3 ) {}
Dim table3 As Single( , ) = New Single( 4, 2) {}

Dim tableStr As String( , ) = New String( 1, 4) {}

Exemple d'écriture de matrices de type Integer :


Dim table1 As Integer( , ) = New Integer(1, 2) {}// deux lignes de dimension 3 chacunes

' dans une instruction d'affectation:


table1( 0 , 0 ) = -458
table1( 2 , 5 ) = -3 '<--- est une erreur de dépassement ! (valeur entre 0 et 1)
table1( 1 , 4 ) = 83 '<--- est une erreur de dépassement ! (valeur entre 0 et 2)
' dans une instruction de boucle:
For i As Integer = 0 To 2
table1(1 , i ) = 3*i-1
Next
' avec initialisation par une variable dans la déclaration :
Dim n As Integer = 3
Dim table1 As Integer( , ) = New Integer(2, n) {} ' 3 lignes de dimension 4 chacunes

L'attribut Length en lecture seule, de la classe abstraite mère Array, contient en fait la taille d'un
tableau en nombre total de cellules qui constituent le tableau (nous avons vu dans le cas uni-
dimensionnel que cette valeur correspond à la taille de la dimension du tableau).
Dans le cas d'un tableau multi-dimensionnel Length correspond au produit des tailles de chaque
dimension d'indice :
Dim table1 As Integer( , ) = New Integer(5, 2) {} [Link] = 6 x 3 = 18
Dim table2 As Char( , , ) = New Char(1,3 ,2) {} [Link] = 2 x 4 x 3 = 24
Dim table3 As Single( , , ,) = New Single( 4, 2, 3, 2) {} [Link] = 5 x 3 x 4 x 3 = 180

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 15


Tableaux déchiquetés ou en escalier
Leur structuration est strictement semblable à celle des tableaux Java et C#, en fait en VB un
tableau déchiqueté est composé de plusieurs tableaux unidimensionnels de taille variable. La
déclaration s'effectue avec des opérateurs parenthèses ( ) ( )… : autant de crochets que de
dimensions. VB autorise des tailles différentes pour chacun des sous-tableaux.
Ci-dessous le schéma d'un tableau T à trois dimensions en escalier :

Ce schéma montre bien qu'un tel tableau T est constitué de tableaux unidimensionnels, les tableaux
composés de cases blanches contiennent des pointeurs (références). Chaque case blanche est une
référence vers un autre tableau unidimensionnel, seules les cases grisées contiennent les
informations utiles de la structure de données : les éléments de même type du tableau T.

Pour fixer les idées figurons la syntaxe des déclarations en VB d'un tableau d'éléments de type
Integer nommé myArray bi-dimensionnel en escalier :
Dim n As Integer = 10
Dim myArray As Integer( )( )
myArray = New Integer (n) ( ){}
myArray(0) = New Integer (6) {}
myArray(1) = New Integer (8) {}
myArray(2) = New Integer (2) {}
myArray(3) = New Integer (3) {}

myArray[n-1] = New Integer (1) {}
myArray[n] = New Integer (7) {}

Ce tableau comporte 7+9+3+4+….+2+8 cellules utiles au stockage de données de type Integer, on


peut le considérer comme une succession de tableaux d'int unidimensionnels (le premier ayant 7
cellules, le second ayant 9 cellules, etc…) . Les déclarations suivantes :

Dim n As Integer = 10
Dim myArray As Integer( )( )
myArray = New Integer (n) ( ){}

définissent un sous-tableau de 11 pointeurs qui vont chacun pointer vers un tableau


unidimensionnel qu'il faut instancier :

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 16


instancie un tableau d'Integer unidimensionnel
myArray(0) = New Integer (6) {}
à 7 cases et renvoie sa référence qui est rangée
dans la cellule de rang 0 du sous-tableau.

instancie un tableau d'Integer unidimensionnel


myArray(1) = New Integer (8) {}
à 9 cases et renvoie sa référence qui est rangée
dans la cellule de rang 1 du sous-tableau.

Etc….

Attention
Dans le cas d'un tableau déchiqueté, le champ Length de la classe Array, contient la taille du sous-tableau uni-
dimensionnel associé à la référence.

Soit la déclaration : myArray = New Integer (n) ( ){}


myArray est une référence vers un sous-tableau de
pointeurs.
[Link] vaut 11 (taille du sous-tableau pointé)

Soit la déclaration :
myArray(0) = New Integer (6) {}
MyArray (0) est une référence vers un sous-tableau de
cellules d'éléments de type Integer.
myArray(0).Length vaut 7 (taille du sous-tableau pointé)

Soit la déclaration :
myArray(1) = New Integer (8) {}
MyArray (1) est une référence vers un sous-tableau de
cellules d'éléments de type int.
myArray(1).Length vaut 9 (taille du sous-tableau pointé)

VB initialise les tableaux par défaut à Nothing, soit 0 pour les


Integer, Byte, ... et à une référence nulle pour les objets.

On peut simuler une matrice avec un tableau déchiqueté dont tous les sous-tableaux ont exactement
la même dimension. Voici une figuration d'une matrice à n+1 lignes et à p+1 colonnes avec un
tableau en escalier :

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 17


- Contrairement à Java qui l'accepte, le code ci-
dessous ne sera pas compilé parVB :

Dim table As Integer( )( )


table = New Integer (n) (p){}

- Il est nécessaire de créer manuellement tous les


sous-tableaux à partir de la première dimension
du tableau en escalier :

Dim table As Integer( )( )


table = New Integer (n) ( ){}

for (int i=0; i<n+1; i++)


table(i) = New Integer (p) {}

Conseil
L'exemple précédent montre à l'évidence que si l'on souhaite réellement utiliser des
matrices en VB, il est plus simple d'utiliser la notion de tableau multi-dimensionnel
([ , ) que celle de tableau en escalier ( ) ( ).

Egalité et inégalité de tableaux


L'opérateur d'égalité = appliqué au tableau de n'importe quel type, fonctionne en VB comme sa
surcharge sur les String c'est-à-dire qu'il détermine si deux tableaux spécifiés ont les mêmes
valeurs même si leurs références sont différentes.

L'opérateur d'égalité "=" ne se comporte pas dans ce cas comme la méthode Equals de la
classe Object qui ne teste que l'égalité de référence et non l'égalite des valeurs.

Soient Dim a, b As Integer, (a = b ) renvoie true si la référence a est la même que la référence
b ; sinon il renvoie false.

Le morceau de code ci-dessous créé deux tableaux de char t1 et t2, puis teste leur égalité avec
l'opérateur = et la méthode Equals :

Dim t1 As Char( ) = "abcdef".ToCharArray( )


Dim t2 As Char( ) = "abcdef".ToCharArray( )

If t1 = t2 Then
[Link]("t1=t2")
Else
Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 18
[Link]("t1<>t2")
End If
If [Link](t2) Then
[Link]("t1 égal t2")
Else
[Link]("t1 différent de t2")
End If

Après exécution on obtient :


t1 = t2
t1 différent de t2

Ces deux objets (les tableaux) sont différents (leurs références pointent vers des blocs différents)
bien que le contenu de chaque objet soit le même : l'opérateur = rend compte de l'égalité de leurs
contenus et la méthode Equals de l'égalité de leurs reférences.

Recopie de tableaux quelconques


Comme les tableaux sont des objets, l'affectation de références de deux tableaux distincts donne
les mêmes résultats que pour d'autres objets : les deux références de tableaux pointent vers le
même objet. Donc une affectation d'un tableau dans un autre t1 = t2 ne provoque pas la recopie
des éléments du tableau t2 dans celui de t1.

Si l'on souhaite que t1 soit une copie identique de t2, tout en conservant le tableau t2 et sa
référence distincte il faut utiliser l'une des deux méthodes suivante de la classe abstraite mère
Array :
Function Clone As Object : méthode qui renvoie une référence sur une nouvelle instance de
tableau contenant les mêmes éléments que l'objet de tableau qui l'invoque. (il ne reste plus qu'à
transtyper la référence retournée puisque clone renvoie un type object)

Shared Sub Copy ( tableSource As Array, tableDestination As Array, long As Integer) : méthode
de classe qui copie dans un tableau tableDestination déjà existant et déjà instancié, long éléments du
tableau tableSource depuis son premier élément (si l'on veut une copie complète du tableau
tableSource dans tableDestination, il suffit que long représente le nombre total d'éléments soit long
= [Link]).

Attention

Dans le cas où le tableau tableSource contient des références qui pointent vers des objets :

La recopie dans un autre tableau à travers les méthodes Clone ou Copy ne recopie que les
références, mais pas les objets pointés, voici un "clone" du tableau tableSource de la figure
précédente dans le tableau tableDestination:

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 19


Si l'on veut que le clonage (la recopie) soit plus complète et comprenne aussi les objets pointés,
il suffit de construire une telle méthode car malheureusement la classe abstraite Array n'est pas
implantable par l'utilisateur mais seulement par le compilateur et nous ne pouvons pas redéfinir
la méthode virtuelle Clone).

Code source d'utilisation de ces deux méthodes Clone et Copy sur un tableau unidimensionnel
et sur une matrice :
//-- tableau à une dimension :
Dim t(10) As Integer Déclaration avec définition
For k As Integer = 0 To 10 explicite de taille.
t(k) = k * 10
Next
Déclaration de référence,
puis clonage et transtypage.
Dim tab As Integer
tab = CType([Link](), Integer( ))

Dim tab As Integer = New Integer(10) Déclaration avec définition explicite nécessaire
[Link] ( t , table , [Link] ) de la taille, afin de pouvoir lancer la copie.

//-- tableau à deux dimensions :


Dim matr(3,2) As Integer
For i As Integer = 0 To 3
For j As Integer = 0 To 2
Matr (i , j) = i+j
Next Déclaration de référence,
Next puis clonage et transtypage.
Dim matrtab( , ) As Integer Déclaration avec définition explicite nécessaire
matrtab= CType([Link](), Integer( , )) de la taille, afin de pouvoir lancer la copie.
Dim matrtable (3 , 2 ) As Integer
[Link] ( matr , matrtable , [Link] )

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 20


Parcours itératifs de tableaux – For Each…In…Next

Les instructions itératives For, While, Do… précédemment vues permettent le parcours d'un tableau
élément par élément à travers l'indice de tableau. Il existe une instruction d'itération spécifique For
Each…in qui énumère les éléments d'une collection, en exécutant un ensemble d'actions pour
chaque élément de la collection.
Syntaxe :
For Each <variable-élément> In <variable-collection>
<instructions>
Next <variable>

Sémantique :

Une boucle For Each…Next répète l'exécution de son corps pour chaque élément d'une collection
fixée.

La classe Array est en fait un type de collection car elle implémente l'interface ICollection :

Public MustInherit Class Array Implements ICloneable, IList, ICollection, IEnumerable

Donc tout objet de cette classe (un tableau) est susceptible d'être parcouru par un instruction For
Each…In…Next. Mais les éléments ainsi parcourus ne peuvent être utilisés qu'en lecture, ils ne
peuvent pas être modifiés, ce qui limite d'une façon importante la portée de l'utilisation d'un For
Each…In…Next.

For Each…In dans un tableau uni-dimensionnel


Dans un tableau T à une dimension de taille long, les éléments sont parcourus dans l'ordre croissant
de l'index en commençant par la borne inférieure 0 et en terminant par la borne supérieure long-1
(rappel : long = [Link]).

Dans l'exemple ci-après où un tableau uni-dimensionnel table est instancié et rempli il y a


équivalence de parcours du tableau table, entre l'instruction For de gauche et l'instruction For
Each…In de droite :
Dim table() As Integer = New Integer( 10 ) …. Remplissage du tableau

For index As Integer =0 To [Link]-1 For Each valeur As Integer In table


[Link] (table(index)) [Link] (valeur )
Next Next

For Each…In dans un tableau multi-dimensionnel


Lorsque T est un tableau multi-dimensionnel microsoft indique : … les éléments sont parcourus de
manière que les indices de la dimension la plus à droite soient augmentés en premier, suivis de ceux
de la dimension immédiatement à gauche, et ainsi de suite en continuant vers la gauche.

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 21


Dans l'exemple ci-après où une matrice table est instanciée et remplie il y a équivalence de parcours
de la matrice table, entre l'instruction For de gauche et l'instruction For Each…In de droite :
Dim table( , ) As Integer = New Integer( 3,2 ) …. Remplissage de la matrice

For i As Integer =0 To 3
For j As Integer =0 To 2 For Each valeur As Integer In table
[Link] (table(index)) [Link] (valeur )
Next Next
Next

(le fonctionnement est identique pour les autres types de tableaux multi-dimensionnels et en escalier)

Avantage : la simplicité d'écriture, toujours la même quelle que soit le type du tableau.
Inconvénient : on ne peut qu'énumérer en lecture les éléments d'un tableau.

Programmez objet avec VB .Net - (Ed. du 16.101.2007 ) rm di Scala page 22

Vous aimerez peut-être aussi