Cours VB.NET

Image non disponible


précédentsommairesuivant

V-K. Type valeur ou référence

Image non disponible

Résumons la notion très importante de variable 'par valeur' ou 'par référence'.

Un type de données est un type valeur s'il contient des données dans l'espace qui lui est alloué en mémoire. Un type référence contient un pointeur vers un autre emplacement en mémoire contenant les données.(dixit MicroSoft)

V-K-1. La variable 'par Valeur'

Contient réellement une valeur.

Prenons pour exemple une variable de type 'Long'.

 
Sélectionnez

Dim L As Long

L= 1456 

'L' occupe 8 octets nécessaires pour coder un long, ici L a une valeur de 1456, donc dans ces 8 octets il est codé 1456.

Sont des variables par 'Valeur' :
  • Les Integer, les Long les Short ;
  • Les Single, Double, Decimal ;
  • Les Booleans, Char, Date ;
  • Les Structures ;
  • Les énumérations.

V-K-2. La variable 'par Référence'

Elles ne contiennent pas la valeur de l'objet mais son adresse en mémoire, sa référence.

 
Sélectionnez

Dim O As Object

O contient l'adresse de l'objet codée sur 4 octets.

Sont des variables par référence :
  • Les Objets ;
  • Les Strings ;
  • Les tableaux ;
  • Les Classes.

V-K-3. Influence sur l''Affectation'

Posons le problème:

Travaillons sur A et B, 2 variables ayant la même 'nature'.

A existant déjà, faisons:

 
Sélectionnez

Dim B=A

Puis modifions la valeur de A, cela modifie t-il B?

Les variables par Valeur ou par Référence ne réagissent pas de la même manière:

Si le type de variable est par valeur (valable pour les entiers, les Long.. les structures..), chaque variable ayant sa valeur, B n'est pas modifié.

Si le type de variable est par référence (valable pour les tableaux, les objets, les string..), chaque variable est définie par sa référence (son lieu physique); faire A=B entraîne que A et B ont même référence: ils 'pointent' sur le même endroit. Si on modifie A, B est modifié car il pointe au même endroit.

Voyons des exemples:

Même si on affecte une variable par valeur à une autre, les deux variables restent différentes: elles conservent leur propre espace de stockage:

 
Sélectionnez

Dim L As Long

Dim P As Long

L=0

L=P     'on affecte P à L

P=4     'on modifie P

=> L=0 P=4 Modifier P n'a pas modifié L.

Par contre si on affecte une variable par référence à une autre, elle pointe toutes les 2 sur le même endroit mémoire: si j'en modifie une, cela modifie l'autre.

 
Sélectionnez

'Créons une Classe contenant un entier (Exemple à relire quand vous aurez étudié les Classes)

Class Class1
   Public Value As Integer = 0
End Class

Dim C1 As New Class1()
Dim C2 As Class1 =C1    'on crée C2, on affecte C1 à C2
C2.Value = 123          'on modifie C2

=> C1.Value=123 C2.Value=123 Modifier C2 a modifié C1 car elles pointent sur le même endroit mémoire.

V-K-4. Copie d'objet By Ref: exemple des Tableaux

Exemple sur les tableaux qui sont 'Par référence':

 
Sélectionnez

Dim A(3) As String

A(1) = "a"

Dim B(3) As String

B(1) = "b"

B = A

A(1) = "c"

Label1.Text() = B(1)    'Affiche 'c'

Voyons le détail:

B = A

Un tableau est 'par référence' et le fait de faire A=B donne la même adresse mémoire aux 2 tableaux, aussi , modifier l'un modifie l'autre. C'est ce qui se passe dans notre exemple.

Copie élément par élément.

Si on a déclaré 2 tableaux distinct, B(2)= A(2) affecte un élément d'un tableau à un élément d'un autre tableau, cela ne modifie que la valeur d'un élément et n'affecte pas le tableau. Aussi si on veut faire une copie 'indépendante' d'un tableau, il faut le déclarer puis avec une boucle copier chaque élément du tableau dans le nouveau.

B= A.Clone

B= A.Clone copie le tableau A dans B en conservant 2 tableaux distinct. Ensuite, modifier un élément du tableau ne modifie pas l'autre.

V-K-5. Le cas particulier des 'String'.

Elles sont 'Par référence'.

Attention: par contre :

 
Sélectionnez

Dim A As String

A = "a"

Dim B As String

B = "b"

B = A

A = "c"

Label1.Text() = B    'Affiche 'a'

Bien que les Strings soit par référence, B=A affecte simplement la valeur de A à B, si on modifie ultérieurement A, B n'est pas modifié. (idem pour clone et copy!!) Pour une string qui est 'par référence', il parait donc impossible de la dupliquer, elle se comporte comme une variable par valeur!!

Pourquoi les String sont 'par référence' et se comportent comme si elles étaient 'par valeur'??

L'opérateur d'affectation "=" de deux strings "A=B" a simplement été défini de manière restrictive pour les strings. Les créateurs de vb .net lui ont permis uniquement une copie de la valeur de la string et non de la référence.
Il vaut mieux ne pas permettre l' affectation de la même référence pointant sur le même objet c'est dangereux pour les débutants et cela serait totalement incompatible avec les versions précédentes.. Ensuite, parce que la copie de la valeur d'une string dans une autre est une opération extrêmement courante chez les programmeurs. Ce qui n'est pas le cas de l'affectation de la même référence pointant sur le même objet.

On dit que les String sont 'Immutable' (Comme System.Nullable?).

En conclusion, rien de choquant dans le fait qu'un type string se comporte comme un type par valeur: car c'est juste la définition de l'opérateur d'affectation "=" qui a été redéfinie, et c'est tout. Tout ce qui concerne l'implémentation du type string est strictement comme tous les types par référence. (Merci Sabri pour cette explication)

V-K-6. Déclaration avec New ?

En théorie, il faut utiliser New quand on déclare une variable 'par référence':

Il faut écrire:

 
Sélectionnez

Dim L As Long    'un long est 'par valeur'

Dim F As New Button    'un bouton est un objet 'par référence'

En fait

 
Sélectionnez

Dim L As New Long  'est accepté

Dim O As Object    'est accepté mais on a une référence vide.

Dim S As String    'est accepté.

Pour les Classes ou les objets graphiques, il faut par contre bien taper New pour créer l'objet:

 
Sélectionnez

Dim F As New Button

Si on tape Dim F As Button on crée une référence vide, mais pas d'objet Button.

V-K-7. Valeur après déclaration

Apres création (avant initialisation) une variable numérique 'par Valeur' contient 0,

 
Sélectionnez

Dim L As Long    'L contient 0

Par contre une String (par référence) qui a été créée par Dim et non initialisée contient 'Nothing'.

 
Sélectionnez

Dim S As String    'S contient Nothing: il ne pointe sur aucun objet.

On peut tester par If IsNothing( O ) then.. ou If O Is Nothing..

Pour les tableaux, bien que le tableau soit 'par Référence', c'est le type de variable utilisé dans le tableau qui décide de la valeur des éléments après déclaration.

 
Sélectionnez

Dim T(3) As Long    '=>T(0)=0 

V-K-8. Comparaison

1-Une variable par Valeur peut être comparée à une autre par "=",

 
Sélectionnez

Dim L As Long=12

Dim P As Long=24

If L=P Then..

2-Par contre une variable par référence peut être comparée à une autre par "Is".

 
Sélectionnez

Dim O As Object

Dim Q As Object   

If O Is Q then..

NB: pour les String '=' et 'Is' peuvent être utilisés.

3-Equals peut être utilisé pour comparer les 2 types de données:

 
Sélectionnez

Obj1.Equals(Obj2)  'Retourne True si Obj1 et Obj2 ont le même pointeur.

ou

 
Sélectionnez

N1.Equals(N2)    'Retourne True si la valeur de N1= la valeur de N2
 

Pour les types 'référence', l'égalité est définie comme une égalité d'objets, c'est-à-dire si les références renvoient ou non au même espace mémoire. Pour les types valeur, l'égalité est définie comme une égalité au niveau du bit , autrement dit si la valeur est la même.

V-K-9. IsReference

Il existe une instruction permettant de voir si une variable est de type 'Par référence'.

Cet exemple utilise la fonction IsReference pour vérifier si plusieurs variables font référence à des types référence.

 
Sélectionnez

Dim R as Boolean
Dim MyArray(3) As Boolean
Dim MyString As String
Dim MyObject As Object
Dim MyNumber As Integer

R = IsReference(MyArray) '  R= True. Tableau
R = IsReference(MyString) ' R= True. String
R = IsReference(MyObject) ' R= True. Objet
R = IsReference(MyNumber) ' R= False. Entier

V-L. Variable 'Object' et autre type

Image non disponible

Il existe un autre type de variable: le type 'Object'.

V-L-1. 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.

 
Sélectionnez

Dim myObjet As Object

Ensuite:

 
Sélectionnez

myObjet=12

est accepté, et myObjet sera considéré comme un type Integer.

 
Sélectionnez

myObjet=12.6

est accepté, et myObjet sera considéré comme un type Single.

 
Sélectionnez

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.

 
Sélectionnez

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:

 
Sélectionnez

If TypeOf myObjet Is String Then..

 
End if

Attention, TypeOf Is retourne True aussi pour les Classes d'objet parent.

 
Sélectionnez

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).

V-L-1-a. Comment utiliser les propriétés d'un objet ?

Comment utiliser les membres des variables String qui sont dans un objet?

Exemple: mettre une string dans une variable Objet, connaître la longueur de la String.

  • -Si Option strict=Off (On force VB à ne pas être trop Strict!!! On verra cela plus loin)
 
Sélectionnez

Dim myObjet As New Object

myObjet="VB"

MessageBox.Show(myObjet.length)  'affiche 2 
  • -Si Option strict=On (On force VB à ne rien tolérer)

MessageBox.Show(myObjet.length) déclenche une erreur car length n'est pas une propriété des Object.

Il faut convertir l'objet en String et là, on peut utiliser 'Length': il faut écrire simplement:(Merci le forum de developpez.com)

 
Sélectionnez

Dim myObjet As New Object

myObjet="VB"

MessageBox.Show(DirectCast(myObjet, String).Length.ToString)

DirectCase transforme un type de variable en un autre, DirectCase peu'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.

 
Sélectionnez

Dim myObjet As New Object

myObjet="VB"

Dim  myString  As String

myString = CType(myObjet, String)

MessageBox.Show(myString.Length.ToString)

Au départ, VB ne sait pas quel type de variable sera dans l'objet, on ne connaît donc pas les propriétés de la variable; la recherche de la propriété 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).

On évitera donc d'utiliser si possible des variables 'Object'.

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.

V-L-1-b. Comparaison d'objets

Is permet de savoir si 2 variables object se rapportent à la même instance.

 
Sélectionnez

Dim o1 As New Objet = monObjet

Dim o2 As Objet

o2= o1

If o1 Is o2 Then..

V-L-1-c. Nothing

Après:

 
Sélectionnez

Dim myObjet As Object

myObjet contient Nothing, c'est à dire 'Rien': pas de référence à une instance.

Après avoir utiliser myObjet=12

On peut faire 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

V-L-2. 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 'control': bouton, ou textbox ou formulaire.

 
Sélectionnez

Dim myButton As New Button    'crée une variable myButton de type Button

Ensuite on peut utiliser les membres de la classe Button.

 
Sélectionnez

myButton.BackColor

Autre exemple: créons un TextBox:

 
Sélectionnez

Dim myTextBox As New TextBox    'crée une variable myTextBox de type TextBox

V-L-3. Utilisez donc des variables le plus typées possible

Eviter les 'Object'. Utilisez donc des variables le plus typées possible.

Si une variable doit contenir des boutons, créer une variable de type '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

 
Sélectionnez

Dim fistControl As New System.Windows.Forms.Control

fistControl= New Button

Plus la variable sera typée plus le code sera rapide, solide, plus on évitera les erreurs de programmation.

V-L-4. Attention quand on met un objet dans une variable objet

Si je met un Button dans une variable Object.

 
Sélectionnez

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:

 
Sélectionnez

Dim MyTexte As String = CType(MyObjet, Button).Text

V-M. Variable Booléenne

Mr Georges Boole 1805-1864
Mr Georges Boole 1805-1864

Il existe un autre type de variable: le type 'Boolien 'ou 'Booléen'(Boolean).

V-M-1. Introduction

L'algèbre de Boole est la partie des mathématiques, de la logique de l'électronique et de l'informatique qui s'intéresse aux opérations et aux fonctions sur les variables logiques. En logique propositionnelle, une expression est soit vraie soit fausse. (le vrai (1) et le faux (0)).

Georges Boole (1815-1864), physicien Anglais définit en 1847 un algèbre qui est applicable au raisonnement logique, qui traite des fonctions à variables binaires (deux valeurs). Mais il ne s'applique pas aux systèmes à plus de deux états d'équilibre.

Une variable booléenne, ou logique, ou binaire ne prend que deux valeurs (elle est généralement stockée sous la forme d'un bit).

Vers la fin des années 30, Claude Shannon démontra qu'à l'aide d'interrupteurs fermés pour « vrai » et ouverts pour « faux » il était possible d'effectuer des opérations logiques en associant le nombre 1 pour « vrai » et 0 pour « faux ».

Ce codage de l'information est nommé base binaire. C'est avec ce codage que fonctionnent les ordinateurs. Il consiste à utiliser deux états (représentés par les chiffres 0 et 1) pour coder les informations.

Il permet d'étudier les circuits logiques.

V-M-2. Les booléens

On a parfois besoin de savoir si une assertion est vraie ou Fausse.(True ou False)

Pour stocker une information de ce type, on utilise une variable de type booléen. Une variable de ce type ne peut contenir que True ou False.

Le terme booléen vient de "l'algèbre de Boole", cette algèbre ne travaille que sur les valeurs 1 ou 0 (True ou False)

Soit myBoolean une variable booléenne:

 
Sélectionnez

Dim myBoolean As Boolean

On peut écrire myBoolean = True

On peut aussi tester cette variable:

 
Sélectionnez

If myBoolean = False Then..

L'expression après If est évaluée, si elle est vraie 'Then' se produit.

Autre exemple montrant comment le raisonnement informatique est 'logique':

 
Sélectionnez

If maValeur=2 Then ..

End If

L'expression 'maValeur=2' est évaluée, si maValeur est effectivement égal à 2, l'expression prend la valeur True; dans ce cas le programme se poursuit après Then.

si maValeur est différent de 2, maValeur=2 est évaluée et prend la valeur False; dans ce cas le programme se poursuit après End If.

Un booléen peut donc prendre deux états (vrai/faux, oui/non, 1/0, etc.). Il s'agit donc d'une "valeur binaire". Techniquement, un booléen peut être représenté par un seul bit (binary digit = chiffre binaire).

Dans les langages n'ayant pas de variables booliennes, on se servait souvent d'un entier, avec pour convention que la valeur 0 représente "faux", tandis que toute valeur non nulle représente "vrai". En VB6 vrai était égale à -1. En VB.Net vrai = 1. Mais on s'en fiche car:

un Booléen est un Booléen, en VB.Net on utilise donc True ou False comme seules valeurs pour un Booléen.

Il n'empêche que si on utilise une expression, un nombre et qu'on l'évalue comme si c'était un booléen (C'est pas bien!!), la valeur 0 représente "False", tandis que toute valeur non nulle représente "True".

V-M-3. Les conditions

On a vu que quand il faut faire un choix (comme dans 'If condition Then') il faut une condition qui est une expression booléenne. (avec While, Do Loop aussi).

Exemple:

 
Sélectionnez

If Condition Then    'Si 'condition' est vraie faire..

  ...

End if

 

 

Do Until condition    'Boucler jusqu'à ce que 'condition'

      ...

Loop

 

While Condition        'Tant que 'condition' boucler

...

End While

Pour écrire une condition, on utilise les opérateurs:

 
Sélectionnez

= égal

> supérieur à

 < inférieur à

>= supérieur ou égal

<= inférieur ou égal

<> Différent de

L'évaluation d'une condition donne True (Vrai) ou False (Faux) car on l'a dit c'est une expression booléenne.

Exemple :

 
Sélectionnez

      Dim valeur1 As Integer=2

      Dim valeur2 As Integer=3  

      If valeur1=valeur2 Then

        ...

      End if  

valeur1 étant différent de valeur2, la condition 'valeur1=valeur2' prend la valeur False et le programme passe à la ligne après End If).

Ici le signe = n'indique pas une affectation mais 'égale' dans une expression à évaluer.

On peut combiner les opérateurs et mettre des parenthèses:

 
Sélectionnez

 If (valeurC <> valeurD )AND (valeurD =2)

V-M-4. Les opérateurs logiques

Si on a plusieurs expressions logiques, on peut les combiner avec des opérateurs logiques.

Si A et B sont des expressions booléennes:

 
Sélectionnez

A And B     retourne True si A et B sont vrais

A Or B      retourne True si une des 2 est vrai

A Xor B     retourne True si une et une seule est vrai

Not A       retourne True si A est faux et vice versa

IsNot A     A partir de VB 2005

On entend par expression booléenne le résultat de l'évaluation d'une condition:

c=d retourne True si c égal d et False si c différent de d.

Exemple

Si A différent de B.. peut s'écrire If Not(A=B) Then..

Si A compris entre 2 et 5 peut s'écrire If A>=2 And A<=5 Then..

Comment faire une bascule:

Il faut écrire A= Not A

A chaque fois que l'on effectue cette instruction A bascule à True s'il était à False et vice versa.

Les opérateurs AndAlso et OrElse sont plus rapides car ils n'évaluent pas la seconde expression si ce n'est pas nécessaire.

Parfois les expressions sont complexes et on peut les simplifier en utilisant des transformations:

Originale Transformation
Not A And Not B Not (A Or B)
Not A And B Not (A Or Not B)
A And Not B Not (Not A Or B)
A And B Not (Not A Or Not B)
Not A Or Not B Not (A And B)
Not A Or B Not (A And Not B)
A Or Not B Not (Not A And B)
A Or B Not (Not A And Not B)

Exemple pratique:

Si A compris entre 2 et 5 peut s'écrire If A>=2 And A<=5 Then..

ou If Not (A<2 Or A>5) Then...

Une remarque:

Avec une expression Booléenne, on peut écrire:

 
Sélectionnez

Dim a As Boolean= True

If a = True Then..

ou

 
Sélectionnez

If a Then..

Exemple:

 
Sélectionnez

If (x=15)=True  Then..

ou If x=15 Then...

Donc, avec une expression booléenne, et uniquement avec une expression booléenne, il est possible de se passer du = True après un If car de toutes façons , l'expression est évaluée.

IsNot à partir de VB 2005
If Not (Objet1 Is Nothing ) Then..

devient

If Objet1 IsNot Nothing Then

Voir aussi le chapitre sur l'algèbre de Boole.

V-N. Soyons strict et explicite (et Compare et Infer ?)

Image non disponible

VB peut être tolérant ou pas

Image non disponible

Option Strict=On et Option Explicit=On le rendent totalement intolérant, et c'est tant mieux!! Voyons cela.

V-N-1. Notion de conversion Explicite et Implicite

La conversion Explicite: est permet de forcer la conversion d'un type de données vers un autre type à l'aide de mots clés.

Exemple

 
Sélectionnez

Dim d As Double = 2.65

Dim i As Integer

 i=CType(d,Integer)  'conversion d'une valeur double en Integer

Il existe aussi la conversion implicite effectuée automatiquement sans syntaxe particulière et de manière transparente.

VB peut le permettre ( Si Option Explicit Off dans la configuration )

Exemple

 
Sélectionnez

Dim d As Double = 2.65

Dim i As Integer

 i=d  'Pour affecter à i le Double d, Vb a transformé le double d en Integer.

V-N-2. Comment modifier une option ?

Menu Projet puis 'Propriétés de ..'.

Onglet 'Compiler'

En VB 2008:

Image non disponible

Là on peut modifier les options de compilation.

V-N-3. Option Strict

V-N-3-a. Conversions implicites

Avec Option Strict=On VB refuse les conversions implicites qui pourraient entraîner des pertes de données.

VB est naturellement très arrangeant (trop sympa !!) quand il est configuré avec Option Strict Off :

Par défaut il transforme, quand c'est possible, et si nécessaire un type de variable en un autre type.

Si je passe un nombre qui est en double précision (Double) dans une variable en simple précision (Single), VB accepte, au risque de perdre de la précision (s'il y a un très grand nombre de chiffre significatif).

Ainsi :

 
Sélectionnez

Dim D As Double

Dim S As Single

D=0.123456789

S=D

MessageBox.Show(s) ' affiche 0,1234568   
'le 9 est perdu car un single à 7 chiffres significatifs.

Cela peut être ennuyeux si c'est des calculs d'astronomie !! et le programmeur ne s'en rend pas forcément compte !!

Pour éviter cela il faut activer l'OPTION STRICT à ON (Elle est par défaut à Off)

Menu Projet > Propriétés de Nom de projet.

Page de propriétés de Langage VB.

Propriétés communes, génération.

En face de Option Strict, mettre On

Maintenant seules les conversions effectuées explicitement seront autorisées.

S=D est souligné dans le code pour signaler une conversion interdite.

(Par contre D=S est accepté car on passe d'une variable à une variable plus précise)

Il faudra maintenant, pour notre exemple, écrire :

 
Sélectionnez

S= CType(D,Single)

Cela entraîne une conversion de la valeur Double en Single; s'il y a perte de précision, elle se produit quand même, MAIS le programmeur SAIT qu'il y a conversion, il prendra ou pas EN CONNAISSANCE DE CAUSE le risque.

Avec Option Strict le langage VB.Net devient bien moins tolérant:

Ecrire un programme avec Option Strict à Off, ça passe; mettre Option Strict à On un tas d'instruction coince!! même certains exemples Microsoft!! Car sans s'en rendre compte on passe d'un type de variable à l'autre sans arrêt!!

V-N-3-b. Conversions String-numérique

Avec Option Strict=On VB refuse les conversions String-numériques implicites.

Avec Option Strict=Off

 
Sélectionnez

Dim n As Integer=12

MessageBox(n)

Affiche 12 : le contenu de l'entier 'n' a été transformé automatiquement en String pour être affiché.

Avec Option Strict=On

 
Sélectionnez

Dim n As Integer=12

MessageBox(n)

Plante

Il faut transformer explicitement n en String et écrire:

 
Sélectionnez

MessageBox(n.ToString)

C'est pour cela qu'il y a des '.ToString' partout!!

V-N-3-c. Liaisons tardives

Avec Option Strict=On VB refuse les liaisons tardives:

 
Sélectionnez

Dim V As Object
V="VB"
MessageBox.Show(V.Length) 'est refusé

MessageBox.Show(V.Length) est refusé

Il faut écrire

 
Sélectionnez

MessageBox.Show(CType(V, String).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.

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.

'Option Strict Off' permet n'importe quoi. C'est du mauvais Basic .

'Option Strict On' oblige à une grande rigueur.

V-N-3-d. VB rapide ?

Avec Option Strict=On VB est plus rapide.

La vérification est effectuée lors de la compilation, à l'exécution il y a moins de contrôle de type.

V-N-4. Option Explicit

Pour la déclaration des variables nous avions dit que toute variable utilisée devait être déclarée.

Par défaut c'est vrai.

Ouvrir Menu Projet > Propriétés de Nom de projet.

Page de propriétés de Langage VB.

Onglet 'Compiler' en VB 2008.

En face de Option Explicit, il y a On

On pourrait (c'est fortement déconseillé) mettre cette option à Off.

Cela ne rend plus obligatoire la déclaration des variables.

MaVariable=10 sans déclaration préalable est acceptée.

Cela présente certains inconvénients : Si on fait une faute de frappe en tapant le nom d'une variable, VB accepte le nouveau nom et crée une nouvelle variable objet distinct.

 
Sélectionnez

Dim MaVariable         'MaVariable avec un b

MaVariabble=10         'Faute de frappe(bb)

Je crois avoir mis 10 dans Mavariable. En fait j'ai mis 10 dans une nouvelle variable nommée MaVariabble

Mavariable à toujours une valeur=0

Donc, c'est clair et sans appel : Laisser Option Explicit à On, ce qui oblige à déclarer toutes les variables avant de les utiliser Dans ce cas si vous tapez le nom d'une variable non déclarée, elles est soulignée en bleue.

V-N-5. Option strict et Explicit dans un module

On peut aussi indiquer dans un module les options; ces instructions doivent être tapées avant toutes les autres.

Image non disponible

V-N-6. Option Compare

Option Compare Binany permet de comparer des chaînes de caractères en fonction de leur code Unicode (le numéro du caractère).

Option Compare Text permet de comparer des chaînes de caractères en fonction du CultureInfo qui prend en compte, pour chaque langue, la signification, la sémantique du caractère.

Exemple : Comparons 2 caractères, on affiche True s'ils sont égaux.

 
Sélectionnez

Console.WriteLine("a" = "A")   

Donne True si Option Compare Text car sémantiquement parlant c'est le même caractère, du moins il a la même signification.

Donne False si Option Compare Binary car le code Unicode de "a" et de "A" n'est pas le même .

Avec Option Compare Binary:

Les caractères sont classés dans un ordre croissant (l'ordre de leur code unicode)

Voyons l'ordre des certains caractères particuliers:

" " +,-./ 0123456789 :;ABCDEF abcdef èéê

On constate que l'ordre est espace puis quelques caractères spéciaux, les chiffres, les majuscules puis les minuscules, les accentués.(voir le tableau d'Unicode)

Ainsi "B" est inférieur à "a".

En utilisant Option Compare Binary, la plage [A-E] correspond à A, B, C, D et E.

Avec Option Compare Text:

Les caractères sont classés dans un ordre qui reflète plus la réalité d'un texte:

Toutes les types de a: A, a, À, à, puis tous les types de b: B, b...

Avec Option Compare Text, [A-E] correspond à A, a, À, à, B, b, C, c, D, d, E et e. La plage ne correspond pas à Ê ou ê parce que les caractères accentués viennent après les caractères non accentués dans l'ordre de tri.

Ainsi "B" est supérieur à "a".

V-N-7. Option Infer

Option Infer apparait en VB 2008. Débutant passe ton chemin.

'Option Infer On' permet de se passer de donner le type d'une variable quand on la déclare. Lors de l'utilisation de la variable, elle prendra le type nécessaire. Ainsi, si on met une String dans la variable cela devient une variable String.

Par défaut on a Option Infer Off.

Exemple:

 
Sélectionnez

Option Infer On

Module Test
      Sub Main()
            ' Le type de x est ' Integer'
            Dim x = 10

            ' Le type de y est 'String'
            Dim y = "abc"
      End Sub
End Module

Son utilité se retrouve dans l'usage de base de données et surtout de Linq qui permet d'interroger les bases de données.

Éviter Option Infer On pour du code habituel.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © . Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.