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