|
Site |
Cours VB.net |
|
|
|
Les variables 'Object'et les autres. |
|
|
Il existe un autre type de variable: le type 'Object'.
Le Type 'Object':
Parfois on ne sait pas ce que va contenir une variable: un Integer? une String? un Single?
Pour résoudre ce problème on utilise une variable de type 'Object'
Cela remplace le type 'Variant' de VB6
Dim myObjet As Object
Ensuite:
myObjet=12
est accepté, et myObjet sera considéré comme un type Integer
myObjet=12.6
est accepté, et myObjet sera considéré comme un type Single
myObjet="Visual Basic"
est accepté aussi, et myObjet sera considéré comme un type String
Les 3 affectations myObjet= peuvent se suivre sans planter, l'objet contenant successivement un type Integer, Single et String.
On rappelle qu'une variable objet est une variable 'Par référence'.
On peut, suite au dernier exemple, récupérer l'objet et le transformer en String.
Dim myObjet As Object
myObjet="Visual Basic"
Dim maString As String
maString= CType(myObjet, String)
Comment savoir quel type de variable contient la variable 'Objet'?
Si on fait myObjet.GetType.ToString cela retourne 'System.string' indiquant que myObjet contient bien une String.
myObjet.GetType.Name retourne 'String'
Pour tester si myObjet est une String, il y a une autre manière avec TypeOf Is:
If TypeOf myObjet Is String Then
End if
Attention, TypeOf Is retourne True aussi pour les Classes d'objet parent.
Dim monlabel As New Label
If TypeOf monlabel Is Control Then ' est vérifié car label dérive de control
monlabel est bien un label mais c'est aussi un control.(On verra que tous les objet visuel comme Label dérive de la classe Control).
Comment utiliser les membres d'une variable objet?
Exemple: mettre une string dans une variable Objet, connaître la longueur de la String.
Dim myObjet As New Object
myObjet="VB"
MessageBox.Show(myObjet.length) affiche 2
MessageBox.Show(myObjet.length) déclenche une erreur: les liaisons tardives ne sont pas acceptées.
Il faut écrire simplement:(Merci le forum de developpez.com)
Dim myObjet As New Object
myObjet="VB"
MessageBox.Show(DirectCast(myObjet, String).Length.ToString)
ou
MessageBox.Show(CType(myObjet, String).Length.ToString)
DirectCase et CType transforme un type de variable en un autre, DirectCase est moins 'tolérant' car la variable qui reçoit doit être du bon type.
Une autre méthode consiste à transformer par Ctype le contenu de l'objet vers une variable String, puis à afficher la longueur de cette variable String.
Dim myObjet As New Object
myObjet="VB"
Dim myString As String
myString = CType(myObjet, String)
MessageBox.Show(myString.Length.ToString)
Du
fait que les membres utilisés avec une variable Object ne sont pas définis à
l'écriture du programme (on ne sait même pas quel type de variable sera dans
l'objet, on n'en connaît donc pas les membres), la recherche du membre se fait à
l'exécution, c'est plus long, de plus les contrôles et vérifications se font à
l'exécution.
Cela se nomme une liaison tardive, à éviter donc. On évitera donc d'utiliser si possible des variables 'Objet'.
Utilisez plutôt des variables typées (des variables String , Integer..) au départ, quand on les utilise, les contrôles et appels sont vérifiés dés le départ, on appelle cela une
liaison anticipée ou précoce.
Comparaison d'objet.
Is permet de savoir si 2 variables object se rapportent à la même instance.
Dim o1 As New Objet = monObjet
Dim o2 As Objet
o2= o1
If o1 Is o2 Then..
Nothing.
Après Dim myObjet As Object, myObjet contient Nothing, c'est à dire 'Rien': pas de référence à une instance.
Après avoir fait myObjet=12, myObjet contient quelque chose.
On peut aussi écrire myObjet=Nothing.
Lorsque vous assignez Nothing à une variable objet, cette dernière ne fait plus référence à une instance d'objet, elle ne pointe sur rien.
Si la variable avait fait référence à une instance au préalable, l'assignation de Nothing à la variable ne met pas fin à l'instance. L'instance se termine, et les ressources mémoire et système qui lui sont associées sont libérées uniquement lorsque le garbage collector (qui fait le ménage) détecte l'absence de toute référence active restante.
On peut tester si un Objet contient Nothing avec
.IsNothing
Les variables d'autres types:
On verra que l'interface utilisateur est composée de contrôles, ces contrôles étant des objets, et bien, on peut déclarer une variable de type 'contrôles': bouton, ou textbox ou formulaire.
Dim myButton As New Button 'crée une variable myButton de type Button
Ensuite on peut utiliser les membres de la classe Button
myButton.BackColor
Dim myTextBox As New TextBox 'crée une variable myTextBox de type TextBox
Utilisez donc des variables le plus typées possible.
Eviter les Object.
Si une variable doit contenir des boutons, créer une variable Button.
Si une variable doit être utilisée pour contenir divers choses: Button, ListBox... plutôt que la déclarer en Objet, il est préférable de la déclarer en System.Windows.Forms.Control
Dim fistControl As New System.Windows.Forms.Control
fistControl= New Button
Attention quand on met un objet dans un autre objet:
Si je met un Button dans une variable Object.
Dim MyObjet As Object
MyObjet = Button1
MyObjet donne accès aux propriétés des Object (Equals, GetType, ToString...); pour utiliser les propriétés de Button (comme Text par exemple, il faut d'abord transformer l'objet en Button en écrivant : CType(MyObjet, Button).
Par exemple, pour mettre le texte du button contenu dans MyObjet dans la variable MyTexte, il faut écrire:
Dim MyTexte As String = CType(MyObjet, Button).Text
|
|
|
|
|