|
Site |
Cours VB.net |
|
|
|
Soyons Strict et Explicite. |
|
|
VB peut être tolérant ou pas
.
Option Strict=On et Option Explicit=On le rendent totalement intolérant, et c'est tant mieux!! Voyons cela.
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
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
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.
Modifier les Options:
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 VB 2003
Onglet 'Compiler' en VB 2005.
En VB 2005:
A- Option Strict
1-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 :
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 VB 2003.
-Onglet 'Compiler' en VB 2005 ou 2008.
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= 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:
Écrire 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!!
2-Avec Option Strict=On VB refuse les conversions String<->numériques implicites.
Avec Option Strict=Off
Dim myObjet As New Object 'on crée un objet
myObjet = "Bonjour" 'on y met une string
MsgBox(myObjet.GetType) 'on affiche le type de l'objet
Affiche le type contenue dans l'objet: String : le type 'prompt' que retourne GetType a été transformé automatiquement en String pour être affiché.
Avec Option Strict=On
Dim myObjet As New Object
myObjet = "Bonjour"
MsgBox(myObjet.GetType)
Plante
Il faut transformer explicitement myObjet.GetType en String et écrire:
MsgBox(myObjet.GetType.ToString)
Par contre Vb est plus tolérant pour la conversion de numérique en String: même avec Option Strict=On il accepte:
Dim i As Integer = 12
MsgBox(i) 'affiche la valeur d'un entier
On aurait pu penser qu'avec Option Strict=On il aurait fallu écrire:
Dim i As Integer = 12
MsgBox(i.ToString) mais MsgBox(i) est accepté.
3-Avec Option Strict=On VB refuse les 'Liaisons tardives':
Avec Option Strict=On VB refuse les liaisons tardives:
Dim V As Object
V="VB"
MessageBox.Show(V.Length) est refusé car à la compilation on ne sait pas de quel type est V, il faudra 'tardivement', lors de l'exécution, traiter le fait que V est une String et qu'il a une propriété nommée Length, c'est une liaison tardive.
Il faut écrire
MessageBox.Show(CType(V, String).Length.ToString)
Là, à la compilation, on transforme l'objet en String et ainsi, on peut avoir accès à sa propriété Length, c'est une liaison précoce.
'Option Strict Off' permet n'importe quoi.
'Option Strict On' oblige à une grande rigueur.
4-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 et cela va plus vite.
B- 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.
Propriétés communes, génération.
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.
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
Si Option Explicite= On , VB aurait indiqué que MaVariabble avec une faute n'est pas déclarée.
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.
C-Option Compare
Option Compare Binany permet de comparer des chaînes de caractères en fonction de leur code Unicode.
Option Compare Text permet de comparer des chaînes de caractères en fonction du CultureInfo.
Exemple :
Console.WriteLine("a" = "A")
' donne True si Option Compare Text car sémantiquement parlant c'est le même caractère.
' donne False si Option Compare Binary car le code Unicode de "a" et "A" n'est pas le même .
Par défaut (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<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ées 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>a
D-Option Infer (en VB 2008)
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 le variable cela devient une variable String.
Par défaut on a Option Infer Off
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 de Linq.
Éviter Option Infer On pour du code habituel.
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.

|
|
|
|
|