|
Site |
Cours VB.net |
|
|
|
VB.NET 2008 et le Framework 3.5 |
|
|
On peut charger VB Express 2008 et le Framework 3.5 en français (usage gratuit) ICI
Msdn 2008 Exemples de programme Vb 2008
On verra les nouveautés dans:
A- le Frameworks 3.5
B- l'IDE
C- le langage visual basic
A- LE FRAMEWORK 3.5
Un Framework est donc un ensemble de Classes.
Le Framework 2.0 était utilisé par VB 2005.
Le Framework 3.0 c'est le Framework 2 auquel s'ajoute WPF WCF WF WCS.
Windows Presentation Foundation (WPF) ex 'avalon'utilise un moteur de rendu vectoriel et des accélérations matériels pour afficher. Présent dans la version Express.Windows Communication Foundation (WCF) ex 'indigo'
permet de développer des applications distribuées inter opérables, fiables et sécurisées. WCF simplifie le développement d'applications connectées. Non présent dans la version Express.
Windows Workflow Foundation (WF) est constitué d'un modèle de programmation, d'un moteur d'exécution et d'outils, pour développer et intégrer des workflows dans les applications .NET. (un workflow est une succession d'actions ou d'étapes qui s'exécutent dans un ordre prédéfini). Non présent dans la version Express.
Windows CardSpace (WCS), ex Infocard, est une nouvelle technologie qui permet aux utilisateurs de prouver leur identité. Non résent dans la version Express.
Le Framework 3.5 est utilisé par VB2008.
C'est le Framework 3 auquel s'ajoute AJAX (utilisable dans les WebForms), LINQ et REST (C'est quoi?).
Vista comporte nativement le Framework 3.0.
VB 2008 permet de choisir et d'utiliser le Framework 2.0, 3.0 ou 3.5.089
Depuis le Framework 2 le CLR (Common Langage Runtime), le moteur, est toujours le même: c'est la version 2.
Attention:
Collection HashSet
Cette nouvelle collection travaille sur les ensembles.
Il s'agit d'une collection sans ordre qui contient des éléments uniques. HashSet possède comme toutes les collections Add, Remove et Contains.. et fournit plusieurs opérations d'ensembles (notamment l'union, l'intersection et la différence symétrique)ce qui permet de prendre en charge la plupart des opérations mathématiques qui sont généralement réalisées sur des ensembles (sens mathématique du terme).
Dim hs As New HashSet(Of String)
Ajout d'éléments:
hs.Add("toto")
hs.Add("lulu")
hs.Add("titi"
La méthode Add renvoie True ou False pour indiquer si elle a fonctionné (s'il n'y avait pas déjà dans la HashSet l'élément que l'on veut ajouter).
Dim caMarche As Boolean = hs.Add("toto") 'retourne False
hs.Count donne le nombre d'élément.
On peut effacer un élément:
hs.Remove("lulu")
On peut effacer sous condition:
Exemple: effacer tous les éléments contenant un "t":
hs.RemoveWhere( Adress Of Test)
'La fonction Test reçoit chaque string de la table et retourne un booléen qui indique si la condition est rempli ce qui déclenche le Remove.
Private Shared Function Test(ByVal s As String) As Boolean
Return (Instr(s,"t")<>0)
End Function
On peut ajouter la collection hs2 à hs grâce à UnionWith:
hs.UnionWith(hs2)
Les éléments doublons (qui existent déjà dans hs ne sont pas ajoutés.
Cela correspond à un And sur les 2 ensembles.
On peut rechercher les éléments commun à hs2 et à hs grâce à IntersectWith:
hs.IntersectWith(hs2)
hs contient maintenant les éléments qui étaient présent dans hs et hs2
Cela correspond à un Or sur les 2 ensembles.
On peut supprimer tous les éléments de hs qui sont aussi contenus dans la collection passée en paramètre (hs2) avec ExceptWith
hs.ExceptWith(hs2)
hs contient maintenant les éléments qui n'étaient pas présent dans hs et hs2
On peut rechercher les éléments contenus dans hs2 et dans hs mais pas dans les 2 grâce à SymmetricExceptWith:
hs.SymmetricExceptWith(hs2)
hs contient maintenant les éléments qui étaient présent dans hs ou hs2 mais pas les deux.
On peut rechercher si hs2 est un sous ensemble de hs grâce à IsSubsetOf:
Dim b As
Boolean= hs.IsSubsetOf(hs2)
b est égal à True si hs est un sous ensemble de hs2 (tous les éléments de hs sont dans hs2).
Il existe aussi:
IsProperSubstOf qui retourne True si hs est un sous ensemble de hs2 et si hs différent de hs2 (sous ensemble strict)
On peut rechercher si hs est un sur ensemble de hs grâce à IsSupersetOf:
Dim b As
Boolean= hs.IsSupersetOf(hs2)
b est égal à True si hs est un sur ensemble de hs2 (tous les éléments de hs2 sont dans hs).
Il existe aussi:
IsProperSupersetOf qui retourne True si hs est un sur ensemble de hs2 et si hs est différent de hs2 (sur ensemble strict)
TimeZone
Les nouvelles classes DateTimeOffset et TimeZoneInfo permettent de mieux gérer les applications qui utilisent les zones dates et heures.
Suite B
Vb 2008 gère la cryptographie avec les algorithmes 'Suite B' de la NSA.
Support du Peer to Peer
Vb 2008 gère le Peer to Peer grace à l'espace de nom System.Net.PeerToPeer.
AddIn
Il est possible à l'utilisateur d'ajouter à son application des Add-In.
WPF
Plutôt que de travailler avec les WinForms (formulaire habituel utilisant GDI+); en VB 2008 on peut utiliser un mode graphique vectoriel extrêmement performant pour dessiner les formulaires et contrôles: pour cela on utilise les WFP (Windows Presentation Foundation).
Faire menu 'Fichier', 'Nouveau', 'Projet'.
On choisit 'Application WPF', on se retrouve dans un nouvel environnement:
Les formulaires et contrôles sont différents, ainsi que les propriétés des objets graphiques.
Il y a le 'designer' en haut qui permet de dessiner l'interface que verra l'utilisateur. Le designer génère un fichier XAML en bas qui décrit en XML l'interface.
Dans la version Express, il n'y a pas 'cider' qui permet de faire une interface extrêmement élaborée (dégradé de couleur, animation...) Si on était un peu 'maso' on écrirait du code XAML pour faire du graphisme élaboré.
Si on double-clique sur un bouton, par exemple, on se retrouve dans la procédure évènement correspondante:
On se rend compte que les évènements là aussi ne sont pas les mêmes que pour les WindowsForm.
Il y a aussi d'autres modifications comme dans les propriétés du projet:
Support Windows Vista
VB 2008 utilise sous Windows Vista les CommonDialogBox de Vista et à accès à la gestion des droits avec l'usage de l'UAC.
Dans l'ensemble elle ressemble beaucoup à celle de VB 2005. Voir l'IDE de VB 2008
-Le changement majeur est de pouvoir travailler avec les WPF (voir plus bas).
-L'aide est plus élaborée:
Des que je tape une lettre VB propose dans une liste des mots.
Exemple, je tape 'd', il affiche 'Dim', 'Dir'..., de plus si je me met sur un des mots, il ouvre une petite fenêtre d'explication sur le mot avec sa syntaxe.
il est possible de rechercher des informations d'aide par le menu '?'
![]()
La ligne 'Exemple' permet même de charger des exemples de code.
-VB 2008 permet de choisir et d'utiliser le Framework 2.0, 3.0 ou 3.5.
Pour changer de Framework, passer par le menu 'Projet' puis 'Propriétés de..', onglet 'Compiler', en bas il y a un bouton nommé 'Options avancées de compilation...', cliquez dessus:
On peut en bas de la fenêtre modifier le Framework et utiliser le Framework 2, 3, 3.5.
C- NOUVEAUTÉS DANS VISUAL BASIC 2008
Initialisation simplifiée.
Soit une Classe Personne ayant les property Nom et Id
En VB 2005 on pouvait écrire:
Dim per2 As New Personne
With per2
.Nom = "Philippe"
.Id = 2
End With
Si le constructeur le permet (si il accepte 2 arguments pour New)on peut aussi écrire:
Dim per1 As New Personne ("Philippe", 2)
En VB 2008 on peut écrire:
Dim per1 As New Personne With {.Nom = "Philippe", .Id = 2}
Inférence de Type
Il faut pour cela que Option Infer =On (Off par défaut)
Passer par le menu 'Projet' puis 'Propriétés de..', onglet 'Compiler'
En plus des options Explicit, Compare, Strict, on peut modifier Option Infer.
L'inférence est la capacité de déduire le type d'une variable par analyse des types fournis en entrées ainsi que des opérations effectuées sur ceux-ci. C'est donc le compilateur qui déduit le type de la variable.
' Type explicite pour une String
Dim Myname1 As String = "Rouge"' Exploitation de l'inférence de type
Dim Myname2 = "Vert"
Le passage du curseur de la souris sur Myname2 vous permet de découvrir que celui-ci est bien un type "String".
On avait dit qu'il fallait travailler avec Option Implicit = True et là on ne déclare même pas le type!!! En fait l'inférence existe afin de supporter par exemple les types anonymes ou encore LINQ.
Il existe des cas pour lesquels l'inférence de type ne se produit pas. Pour les instructions Dim locales, l'inférence de type survient uniquement lorsqu'il y a une assignation sur la ligne de déclaration. Par conséquent, pour les assignations effectuées hors de la déclaration de la variable, le compilateur supposera que le type est Object. Object est également toujours déduit comme type des membres de niveau classe, si bien que l'inférence de type ne s'applique pas aux fonctions, sous-routines, propriétés, champs de classe/structure, etc
Lorsque Option Explicit est Off , une variable locale peut être utilisée dans le code sans déclaration explicite. La variable est supposée être dans ce cas de type Object et tous les appels sont liés tardivement. L'inférence de type ne survient pas sur les variables définies implicitement.
Link
Language-Integrated Query (LINQ),
Langage de requête intégré.
C'est un langage de requêtes (permettant d'interroger une source de données) directement dans le code Visual Basic et à l'aide de mots clés familiers (issues du SQL, le langage d'interrogation des bases de données).
De plus, ce qui est 'magique', ce langage de requêtes est utilisable, non seulement sur les bases de données SQL Serveur et ADO.NET mais aussi sur des documents XML et un ensemble d'objets comme les String, Collections, ListArray..
Exemple: rechercher les nombres pairs dans un tableau d'Integer :
' La Data source: c'est un tableau d'Integer
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}
' Création de la requête.
'Pour chaque élément num dans la source
'Si l'élément num est tel que num Mod 2=0
'Selectionner num et le mettre dans réponses
Dim réponses = From num In numbers _
Where num Mod 2 = 0 _
Select num
' Exécution de la requête.
' On utilise les réponses
For Each number In reponses
Console.Write(number & " ")
Next
Cela affiche sur la console: 0 2 4 6
On peut vouloir compter uniquement les nombres pairs:
Dim nombredepair = (From num In numbers _
Where num Mod 2 = 0 _
Select num).Count()
On remarque que dans le premier exemple (Select num) l'exécution de la requête est effectuée au cours de la boucle For Each (exécution différée par rapport à la création) alors que dans le second exemple (count) , l'exécution est immédiate.
Méthodes d'extension.
Permet d'ajouter des fonctionnalités à une Data Type ( sans devoir faire une Classe dérivée)
Exemple:
Soit le DataType 'String', je veux y ajouter une méthode Print qui affichera la String sur la console:
Imports System.Runtime.CompilerServices
Module StringExtensions
<Extension()> _
Public Sub Print(ByVal aString As String)
Console.WriteLine(aString)
End Sub
End Module
C'est le "ByVal aString As String" qui indique que c'est une extension sur les 'String'.
Comment utiliser la méthode Print?
Imports ConsoleApplication2.StringExtensions
Module Module1
Sub Main()
Dim exemple As String = "Bonjour"
' Appel de l'extension method Print.
exemple.Print()
' Appel de la méthode d'instance 'ToUpper'.
exemple.ToUpper()
exemple.ToUpper.Print()
End Sub
End Module
Si on veut ajouter un paramètre à la méthode Print, il faut l'ajouter au premier paramètre qui lui indique le DataType.
<Extension()> _
Public Sub PrintPonctuation(ByVal aString As String, ByVal punc As String)
Console.WriteLine(aString & punc)
End Sub
Ensuite pour l'utiliser:
Dim exemple As String = "Exemple"
exemple.PrintPonctuation(".")
Lambda Expression
Une expression lambda est une fonction permettant de calculer et retourner une valeur unique.
Exemple: Créons une expression lambda qui incrémente un Integer.
Création de la fonction:
Dim ajoute1 = Function(num As Integer) num + 1
Utilisation de la fonction dans la même sub:
Console.WriteLine(ajoute1(5)) Affiche 6.
On dit que la fonction lambda 'ajoute1( num As Integer)' conduit à num+1.
On peut déclarer et utiliser la fonction en même temps:
Console.WriteLine((Function(num As Integer) num + 1)(5)) Dans ce cas il n'y a pas de nom de fonction.
Attention:
On n'a pas de 'End Function' ni de 'Return' ni de 'As', on ne peut pas utiliser les génériques.
Si on veut déclarer l'expression lambda dans la tête du module afin d'avoir un accès public,
c'est plus complexe:
Class Window1
Delegate Function ajoute(ByVal num As Integer) As Integer
Public ajoute1 As ajoute = Function(num) num + 1
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button.Click
MsgBox(ajoute1(3).ToString)
End Sub
End Class
Voyons comment on peut passer à une Sub une fonction lambda en argument.
On crée une fonction 'testResult' qui a pour argument une valeur et une fonction lambda.
Cette fonction affiche "Success" ou "Failure" en fonction de la valeur True ou False
retournée par la fonction lambda qui a reçu la valeur.
Pour utiliser cette sub on l'appelle avec comme argument la valeur à tester et la fonction Lambda.
Module Module1
Sub Main()
'On appelle une fonction en envoyant une valeur et une fonction lambda.' La ligne affiche "Success" car 4 est pair.testResult(4, Function(num) num Mod 2 = 0)' La ligne affiche "Failure" car 5 n'est pas > 10.testResult(5, Function(num) num > 10)
End Sub
' Sub testResult a 2 arguments, 'value' un Integer et 'fun' la fonction lambda
' On teste la fonction lambda 'fun(value)'
' en fonction du resultat True ou False on affiche "Success" ou "Failure"
Sub testResult(ByVal value As Integer, ByVal fun As Func(Of Integer, Boolean))
If fun(value) Then
Console.WriteLine("Success")
Else
Console.WriteLine("Failure")
End If
End Sub
End Module
Méthode partielle
Elle sont présentes dans des Classes Partielles. Et sur des méthodes privées.
Voici la syntaxe.
Partial Private Sub MyMethode() End Sub
Exemple:
Voici la Classe:
Partial Class Product
Private _Quantity As Integer
Property Quantity() As Integer
...
End Property
Partial Private Sub QuantityChanged()
End Sub
End Class
Ici dans la Classe initiale la méthode partielle QuantityChanged() sert à donner la signature.
L'autre Classe partielle, qui est dessous, ajoute des fonctionnalités à la méthode partielle.
Partial Class Product
Private Sub QuantityChanged()
MsgBox("Quantity was changed to " & Me.Quantity)
End Sub
End Class
XML
On peut créer directement de l'XML dans le code.
On peut créer un élément XML:
Dim contact1 As XElement = _ <contact> <name>Patrick Dupont</name> <phone type="home">206-555-0144</phone> <phone type="work">425-555-0145</phone> </contact>
On peut créer un document XML:
Dim contactDoc As XDocument = _ <?xml version="1.0"?> <contact> <name>Patrick Dupont</name> <phone type="home">206-555-0144</phone> <phone type="work">425-555-0145</phone> </contact>
On peut mettre dans le XML des expressions qui sont évaluées au cours de l'exécution, ces expressions sont de la forme: <%= expression %>.
Exemple: Inclure dans l'élément XML un nombre et une date:
Dim MyNumber As String = "12345"
Dim MyDate As String = "3/5/2006"
Dim livre As XElement = _
<livre category="fiction" isbn=<%= MyNumber %>> <TheDate><%= MyDate %></TheDate> </livre>
Type Nullable.
Les types Par Valeur peuvent être étendus afin d'accepter une valeur normale habituelle ou une valeur Null (Nothing en VB).
On peut déclarer un type Nullable de 3 manières:
Dim MyInteger As Nullable (Of Integer)
Mais aussi:
Dim MyInteger? As Integer
Dim MyInteger As Integer?
C'est le '?' qui force la variable Nullable.
Sur la seconde déclaration, la variable est MyInteger
Autre exemple:
Dim MyBol As Boolean? MyBol pourra prendre la valeur True, False et Nothing.
Cela a de l'intérêt quand on travaille avec les bases de données qui ont des champs qui contiennent un Null et avec Linq.
Type anonyme
Habituellement, on peut déclarer Mycustomer, une instance de la classe Customer et renseigner une propriété .Name.
Dim MyCustomer = New Customer With {.Name = "Philippe"}
Grâce au type anonyme, on peut écrire:
Dim AnomyneCustomer = New With {.Name = "Philippe"}
Remarque= avant New il doit y avoir '=' et pas As.
Cela créer une nouvelle classe anonyme (sans nom) possédant une propriété .Name.
Les types anonymes sont surtout utilisés avec Link:
Exemple:
Dim namePriceQuery = From prod In products _
Select prod.Name, prod.Price
Si products est une liste d'objets avec plein de propriétés, namePriceQuery est une collection de type anonyme qui posséde 2 propriétés: .Name et .Price .
|
|
|
|
|