|
Site |
Cours VB.net |
|
|
|
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 Employeeep.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
|
|
|
|
|