Site:  Cours VB.net  
1.6.6 Les Structures

Permet de regrouper des données de type différent:

 (En Vb6 il y avait les types définis par l'utilisateur, ils sont remplacés par les structures.)

Les structures sont intéressantes quand vous voulez utiliser des variables contenant plusieurs informations de différent type.

Exemple :

Vous voulez définir une variable contenant une adresse composée d'un numéro, de la rue, de la ville.

Il faut d’abord définir la structure (au niveau Module ou Class, pas dans une procédure)

Public Structure Adresse

   Dim Numero     As Integer

   Dim Rue        As String

   Dim Ville      As String

End Structure

 

Puis dans une procédure il faut déclarer la variable :

Dim MonAdresse As Adresse

La variable MonAdresse est déclaré comme une adresse, elle contient donc:

un numéro 'stocké' dans MonAdresse.Numero

une nom de rue 'stocké' dans MonAdresse.Rue  

un nom de ville  'stocké' dans MonAdresse.Ville

On pourra enfin l’utiliser :

MonAdresse.Numero=2

MonAdresse.Rue= "Grande rue"

MonAdresse.Ville= "Lyon"

 

On peut aussi utiliser le mot clé With pour ne pas avoir à répéter le nom de la variable (et cela va plus vite). 

With MonAdresse

    .Rue= "Grande rue"

    .Ville= "Lyon"

End With

With est utilisable sur tous les objets.

 

Il est possible de travailler sur un tableau de structures:

Dim Adresses(99) as Adresse    'Permet de travailler sur un tableau de 100 adresses

Adresses(33).Rue="Place de la mairie"

On peut utiliser une variable déclarée par une structure comme paramètre d'une fonction:

Sub AfficheAdresse( ByVal  UneAdresse As Adresse)

...Imprimer l'adresse

End sub

Pour imprimer l'adresse 33 on écrira   AfficheAdresse ( Adresse(33))

 

Attention quand dans une structure il y a un tableau, il faut l’initialiser:

on veut définir une structure dans laquelle il y a 25 données DriveNumber.

On aurait tendance à écrire:

Public Type DriveInfo

   DriveNumber(25) As Integer FAUX

   DriveType As String

End Type

 

' En Visual Basic .NET il y a 2 méthodes:

1-Méthode par Initialize

Une structure peut comporter une méthode.

Ici, on a crée une méthode Initialize qui redimensionne le tableau interne à la structure.

 

Public Structure DriveInfo

   Dim DriveNumber() As Short

   ' Noter que le nombre d’élément a disparu.

   Dim DriveType As String

   ‘maintenant on instance les 25 éléments.

   Public Sub Initialize()

      ReDim DriveNumber(25)

   End Sub

End Structure

 

Exemple de routine utilisant la structure.

Function AddDrive(ByRef Number As Short, ByRef DriveLabel As String) As Object

   Dim Drives As DriveInfo

   Drives.Initialize()

   Drives.DriveNumber(0) = 123

   Drives.DriveType = "Fixed"

End Function

 

2-Autre manière de faire:

Public Structure DriveInfo

   Dim DriveNumber() As Short

   Dim DriveType As String

End Structure

 

Function AddDrive(ByRef Number As Short, ByRef DriveLabel As String) As Object

   Dim Drives As DriveInfo

   Redim Drives.DriveNumber(25)

   Drives.DriveNumber(3)=12

   Drives.DriveType = "Fixed"

End Function

 

Si on utilise 100 variables Drives, il faudrait 'Redim' le tableau pour chaque variable!!
Dim Drives (100) As DriveInfo

 

For i as Integer =0 to 100

Drives (i).Initialize                    'Dur dur!!

Next i

 

En plus si Dim Drives (100) est en tête d'un module, il faut mettre la boucle dans une procédure.

 

 

Allons plus loin: 

Pour les surdoués!!

Une structure hérite de System.ValueType

Les structures sont des types 'valeur'.

Une variable d'un type structure contient directement les données de la structure, alors qu'une variable d'un type classe contient une référence aux données, ces dernières étant connues sous le nom d'objet.

Cela a de l'importance: si je crée une variable avec une structure, que je copie cette variable dans une seconde, le fait de modifier la première variable ne modifie pas la seconde.

Prenons l'exemple donné par Microsoft:

Structure Point
   Public x, y As Integer
   Public Sub New(x As Integer, y As Integer)
      Me.x = x
      Me.y = y
   End Sub
End Structure 
On définie une structure Point et on définie une méthode New permettant de saisir les valeurs:
Public Sub New  est  un constructeur.
Pour saisir les valeurs de x et y ont peut utiliser:
Dim a As Point
a.x=10
a.y=10
ou utiliser le constructeur:
Dim a As New Point(10,10)  

En partant de la déclaration ci-dessus, le fragment de code suivant affiche la valeur 10 :

Dim a = new Point(10, 10)
Dim b = a
a.x = 100
Console.WriteLine(b.x)	'b est donc bien différent de a

L'assignation de a à b crée une copie de la valeur, et b n'est donc pas affecté par l'assignation à a.x. Si, en revanche, Point avait été déclaré comme une classe, la sortie aurait été 100 puisque a et b auraient référencé le même objet.

Enfin, les structures n'étant pas des types 'référence', il est impossible que les valeurs d'un type structure soient nulles ( elles sont égales à 0 après la création).

Les structures peuvent contenir plein de choses:

On a vu qu'elle peuvent contenir:

Des variables de différent type.

Des tableaux.

Des méthodes : on a vu l'exemple de Initialize et de New.

Mais aussi

     Des objets.

     D'autres Structures.

     Des procédures.

     Des propriétés.

Exemple donné dans l'aide (et modifié par moi) :

Débutant: A relire peut-être ultérieurement quand vous saurez utiliser les Classes.

Cet exemple définit une structure  Employee  contenant une procédure CalculBonus et une propriété Eligible.

Public Structure Employee
Public FirstName As String
Public LastName As String
' Friend members, accessible partout dans le programme.
Friend EmployeeNumber As Integer
Friend WorkPhone As Long
' Private members, accessible seulement dans la structure.
Private HomePhone As Long
Private Level As Integer
Public Salary As Double
Public Bonus As Double
  ' Procedure .
  Friend Sub CalculateBonus(ByVal Rate As Single)
   Bonus = Salary * CDbl(Rate)
  End Sub

' Property pour retourner l'éligibilité d'un employé.
  Friend ReadOnly Property Eligible() As Boolean
    Get
      Return Level >= 25
    End Get
  End Property

End Structure

 

Utilisons cette structure:

Dim ep As Employee    'Déclaration d'une variable Employee

ep.Salary = 100       'On saisit le salaire

ep.CalculateBonus(20) 'On calcul le bonus

TextBox1.Text = ep.Bonus.ToString    'On affiche le bonus

Cela ressemble aux Classes !! Non?

Portée:       

Vous pouvez spécifier l'accessibilité de la structure à l'aide des mots clé: Public, Protected, Friend ou Private ou garder la valeur par défaut, Public. Vous pouvez déclarer chaque membre en spécifiant une accessibilité. Si vous utilisez l'instruction Dim sans mot clé, l'accessibilité prend la valeur par défaut, Public.

Private Mastructure

    Public i As Integer

    ...

End Structute

En conclusion les structures sont maintenant très puissantes et peuvent contenir autant de choses que les modules de Classes , on verra cela plus loin. Mais les structures sont référencées par valeur alors que les Classes le sont par référence