Documente Academic
Documente Profesional
Documente Cultură
James RAVAILLE
http://blogs.dotnet-france.com/jamesr
Sommaire
Introduction ..................................................................................................................................... 3
1.1
Prsentation ............................................................................................................................ 3
1.2
Pr-requis ................................................................................................................................ 3
Prsentation ............................................................................................................................ 4
2.2
Prsentation ............................................................................................................................ 6
Prsentation ............................................................................................................................ 7
4.2
Exemples.................................................................................................................................. 7
7.1.1
7.1.2
Conclusion ..................................................................................................................................... 20
1 Introduction
1.1 Prsentation
Au dbut de lanne 2010, Microsoft proposera Visual Studio 10, la version 4.0 du
Framework .NET, ainsi quune nouvelle version du langage Visual Basic (version 10). Nous vous
proposons dans ce cours, de vous prsenter chacune des nouveauts de ce langage, avec pour
chacune dentre elles :
-
Une partie thorique afin de vous expliquer en quoi elle consiste, et quel est son but, dans
quels cas il est ncessaire/conseill de lutiliser
Une partie pratique avec des exemples de mise en uvre.
Ces nouveauts sont les suivantes :
Beta 1.
1.2 Pr-requis
Avant de lire ce cours, vous devez avoir lu les prcdents cours sur le langage Visual Basic :
-
Les accesseurs en lecture et en criture (get/set), doivent obligatoirement tre tous les deux
prsents. Il nest pas possible de dfinir un accesseur en lecture ou criture seule.
Les accesseurs en lecture et en criture (get/set) ont le mme niveau de visibilit : impossible
de rduire le niveau de visibilit de laccesseur, en lecture ou en criture.
Le type de lattribut gnr est obligatoirement celui de la proprit.
Lintrt des proprits simplifies est dcrire moins de code dans les classes.
Un attribut avec sa proprit (aussi appel proprit par dfaut ), contenant le numro
dimmatriculation dune voiture.
Une autre proprit avec une forme particulire, contenant la marque dune voiture : les
accesseurs en lecture et en criture ne sont pas implments. Il sagit dune proprit
simplifie. Au final, lors de la gnration du code MSIL, notre classe possde deux attributs,
et pour chacun dentre eux, une proprit. Pour lobserver, il suffit de rtro-compiler le
code MSIL de cette classe, avec un outil tel que Reflector (http://www.redgate.com/products/reflector). Voici ce quon peut observer :
Voici un autre exemple, montrant comment crer une collection dobjets de type Voiture :
// VB
Dim oListeVoitures As New List(Of Voiture)
From {New Voiture("34 YT 54"), New Voiture("17 RE 33"),
New Voiture("106 IU 75") With {.Marque = "Peugeot"}}
Lexemple ci-dessus, vous montre quil est aussi possible dutiliser linitialisation dobjets (via
lutilisation du mot cl With), dans une instruction utilisant linitialisation de collections.
4 Le typage dynamique
4.1 Prsentation
Le typage dynamique des objets permet de crer des instructions dynamiques. Ces
instructions permettent dclarer des variables locales, des paramtres de mthodes ou des attributs
de classe, qui seront typs lors de lexcution de lapplication (on parle dans ce cas de liaisons
tardives). Elles peuvent aussi tre utilises comme type de retour de mthodes.
Le typage dynamique exploite une nouvelle fonctionnalit de la CLR, appele la DLR
(Dynamic Language Runtime). Cette fonctionnalit permet dexcuter dans la CLR des langages
dynamiques tels que le langage IronPython ( Python pour .NET).
Une fois dclare dynamiquement, il est possible dutiliser ces membres, sans quaucune
vrification ne soit effectue par le compilateur.
Les intrts des instructions dynamiques sont les suivants :
-
Utiliser plus facilement des objets venant de langage de programmation dynamique tels que
les langages IronPhyton et IronRuby.
Faciliter laccs et lutilisation dobjets COM.
Proposer une alternative la rflexion (mcanismes dintrospection de code MSIL, ).
4.2 Exemples
Soit le bloc dinstructions ci-dessous, que nous pouvons excuter dans une application
Windows Forms :
// VB
Dim var1 As Object = "abc"
Dim var2 As String = var1.ToUpper()
MessageBox.Show(var2)
La premire instruction permet de dclarer une variable nomme var1, et de la typer (lors de
lexcution) en chane de caractres (type string), ce type tant dduit de la valeur daffectation
"abc".
La seconde instruction permet dappliquer (dynamiquement) la mthode ToUpper cette
variable, de manire transformer sa valeur en chane de caractres majuscules.
La troisime instruction permet dafficher dans une boite de message le contenu de la
variable VAR1.
Ces deux classes possdent un accesseur Nom (vous remarquerez lutilisation des accesseurs
simplifis, cf : cours sur les nouveauts du langage Visual Basic 9.0) en commun, ainsi quune
mthode nomme Deplacer.
Voici une autre mthode ayant un paramtre dfini dynamiquement, appliquant une
mthode Deplacer() cet objet, et affiche les informations retournes par cette mthode :
// VB
Public Sub ChangerPosition(ByVal aObjet As Object)
MessageBox.Show(aObjet.Deplacer().ToString())
End Sub
Ces deux exemples mettent en vidence que la mthode Deplacer est bien applique
dynamiquement un objet, dont le type de donnes nest pas explicitement dfini lors de la
compilation, mais lors de lexcution. Elle est applique sur un objet, quelque soit son type, tant que
cette mthode est dfinie au sein de la classe ou hrite dune classe de base. Cependant :
-
Il nest pas possible dappliquer de cette manire les mthodes dextension (cf : cours sur les
nouveauts du langage Visual Basic 9.0).
Il nest pas possible dutiliser les expressions lambda (cf : cours sur les nouveauts du langage
Visual Basic 9.0) comme paramtre des mthodes.
10
// VB
Public Sub Embaucher(ByVal aPersonne As Object)
MessageBox.Show(aPersonne.Nom + " " + aPersonne.Prenom + " a t
embauch le " + DateTime.Now.ToString())
End Sub
Comme nous lavons vu, il est alors possible dappeler cette mthode en passant un objet
cr partir de nimporte quelle classe exposant des proprits Nom et Prenom. Mais cet objet peut
aussi avoir t cr partir dun type anonyme (cf : cours sur les nouveauts du langage Visual Basic
9.0) :
// VB
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button3.Click
Dim oPersonne As New Personne("RAVAILLE", "James")
Dim oPersonne1 = New With {.Nom = "VERGNAULT", .Prenom = "Bertrand"}
Me.Embaucher(oPersonne)
Me.Embaucher(oPersonne1)
End Sub
11
Le langage Visual Basic 10 permet dcrire ce bloc dinstruction, sans avoir utiliser le
caractre de saut dinstruction :
// VB
Dim s As String = "Date 1 : " + DateTime.Now.ToString() +
" Date 2 : " + DateTime.Now.AddDays(1).ToString() +
" Date 3 : " + DateTime.Now.AddMonths(1).ToString()
12
Dans le bloc de code ci-dessous, nous sommes dans lobligation de crer une nouvelle
mthode dans notre classe, contenant le code excut de manire asynchrone, savoir Traiter.
Le langage Visual Basic 10 permet au travers des instructions lambda multi-lignes, de pouvoir
crire un bloc de code iso-fonctionnel, sans avoir crer de mthode supplmentaire dans la classe :
// VB
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button6.Click
Dim oListeNoms = {"James", "Bertrand", "Julien", "Laurent"}
Dim oThread As New System.Threading.Thread(
Sub()
For Each s As String In oListeNoms
' Bloc d'instructions ...
Next s
End Sub)
oThread.Start()
oThread.Join()
End Sub
13
7 La co-variance et la contre-variance
La co-variance et la contre-variance nest pas un nouveau concept. En Visual Basic 8.0, il tait
possible de les appliquer sur des dlgus. Le langage Visual Basic 10 tend la co-variance et la
contre-variance aux interfaces gnriques.
Pour illustrer en quoi consiste la co-variance et la contre-variance, nous allons nous baser sur
le diagramme de classes suivant :
La classe Personne est caractrise par un nom et un prnom. La classe Employe spcialise la
classe Personne, et dfinit un attribut supplmentaire : le salaire.
Voici limplmentation de ces deux classes :
// VB
Public Class Personne
Public Property Nom As String
Public Property Prenom As String
Public Sub New(ByVal aNom As String, ByVal aPrenom As String)
Me.Nom = aNom
Me.Prenom = aPrenom
End Sub
End Class
Public Class Employe
Inherits Personne
Public Salaire As Double
Public Sub New(ByVal aNom As String, ByVal aPrenom As String, ByVal
aSalaire As Double)
MyBase.New(aNom, aPrenom)
Me.Salaire = aSalaire
End Sub
End Class
14
Dans un premier temps, nous dclarons un dlgu nomm PersonneHandler. Pour rappel, il
sagit dun type de donnes permettant de crer des objets pointant vers une mthode. Ce
dlgu permet donc de crer des objets pointant vers une mthode, acceptant un employ
en paramtre et retournant une personne.
Puis nous dclarons deux mthodes ayant des signatures diffrentes. La mthode Embaucher
accepte une personne en paramtre et retourne une personne. La mthode Licencier
accepte un employ en paramtre et retourne aussi une personne.
Dans la mthode DemoVariance :
o Nous dclarons une instance du dlgu nomme oDelegue1 pointant vers la
mthode Licencier, bien que cette mthode ne respecte pas strictement la signature
du dlgu : elle retourne un objet de type Employe au lieu de Personne. Lutilisation
de la co-variance permet lcriture de cette instruction.
o Puis nous dclarons une autre instance du dlgu nomme oDelegue2 pointant vers
la mthode Embaucher, bien que cette mthode ne respecte pas strictement la
signature du dlgu : elle accepte en paramtre de type Personne et non Employe.
Lutilisation de la contre-variance permet lcriture de cette instruction.
15
// VB
Dim oFunc1 As Func(Of Employe, Personne) = AddressOf Embaucher
Dim oFunc2 As Func(Of Employe, Personne) = AddressOf Licencier
Lobjet oFunc1 pointe vers la mthode Embaucher. Lobjet oFunc2 pointe vers la mthode
Licencier.
7.1.1
Vous remarquez lutilisation du mot cl out avant le type gnrique, qui permet de signifier
que le type T, pourra uniquement tre utilis comme type de retour des mthodes dfinies dans ces
interfaces. On dit alors que cette interface est covariante du type T. Ainsi toute numration
dobjets de type A (IEnumerable(Of A)) pourra tre considre comme une numration dobjets de
type B (IEnumerable(Of B)), condition que tout objet A puisse tre converti en objet de type B.
Appliquons maintenant ce principe sur un cas pratique : voici un bloc de code permettant de
crer une liste demploys :
// VB
// Variables locales
Dim oListeEmployes As IList(Of Employe)
// Cration et alimentation de la liste des employes.
oListeEmployes = New List(Of Employe)() From {
New Employe("DURAND", "Alain", 2321.81),
New Employe("VIRON", "Karl", 1398.22),
New Employe("HOIN", "Pierre", 1210.09),
New Employe("HILL", "Tony", 3211.45),
New Employe("FROT", "Elise", 3232.9),
New Employe("ZERA", "Laurence", 2129.98)}
16
Plus concrtement, cette nouveaut se rvle pratique dans le cas suivant. Voici un bloc
dinstructions permettant de crer deux listes dobjets distinctes : lune de personnes et lautre
demploys. Puis de fusionner ces deux listes pour nen former quune seule, et dafficher le nombre
dobjets quelle contient :
// VB
Dim oListePersonnes As New List(Of Personne) from {
new Personne("RAVAILLE", "James"),
new Personne("DOLLON", "Julien"),
new Personne("VERGNAULT", "Laurent")}
Dim oListeEmployes As New List(Of Employe) from {
new Employe("ASSIS-RANTES", "Laurent", 2239.34),
new Employe("DORDOLO", "Matthieu", 1989.99)}
Dim oListeFusion = oListePersonnes.Union(oListeEmployes)
MessageBox.Show("Nombre d'lments : " + oListeFusion.Count().ToString())
7.1.2
17
// VB
Public Interface IEqualityComparer (Of In T)
Function Equals(x As T, y As T) As Boolean
Function GetHashCode(obj As T) As Integer
End Interface
Vous remarquez lutilisation du mot cl in avant le type gnrique, qui permet de signifier
que le type T, pourra uniquement tre utilis comme type des paramtres des mthodes de cette
interface.
Grce cette criture, un objet cr partir dune classe implmentant linterface
IEqualityComparer(Of Object), pourra tre considr comme un objet de type IEqualityComparer(Of
string).
Dfinissons alors une classe nomme PersonneComparer, implmentant linterface
IEqualityComparer(Of Personne). Cette classe permet de dterminer si deux instances de la classe
Personne dsigne la mme personne :
// VB
Public Class PersonneComparer
Implements IEqualityComparer(Of Personne)
Public Function Equals1(ByVal aPersonne1 As Personne, ByVal aPersonne2 As
Personne) As Boolean Implements
System.Collections.Generic.IEqualityComparer(Of Personne).Equals
' Variables locales.
Dim bResult As Boolean
' Initialisation.
bResult = True
' Comparaison des rfrences des deux personnes.
If aPersonne1 IsNot aPersonne2 Then
' Cas des objets NULL.
If (aPersonne1 Is Nothing Or aPersonne2 Is Nothing) Then
bResult = False
Else
' Les deux objets reprsentent la mme personne s'ils ont le
mme nom et mme prnom.
bResult = (aPersonne1.Prenom = aPersonne2.Prenom) And
(aPersonne1.Nom = aPersonne2.Nom)
End If
End If
Return bResult
End Function
18
// VB
Public Function GetHashCode1(ByVal aPersonne As Personne) As Integer
Implements System.Collections.Generic.IEqualityComparer(Of
Personne).GetHashCode
' Variables locales.
Dim iResult As Integer
' Initialisation.
iResult = 0
' On vrifie que l'objet est diffrent de null.
If aPersonne IsNot Nothing Then
' On ontient le HashCode du prnom s'il est diffrent de null.
Dim iHashCodePrenom As Integer = 0
If aPersonne.Prenom IsNot Nothing Then
iHashCodePrenom = aPersonne.Prenom.GetHashCode()
End If
' Calcul du hashCode du nom
Dim iHashCodeNom As Integer = 0
If aPersonne.Nom IsNot Nothing Then
iHashCodeNom = aPersonne.Nom.GetHashCode()
End If
' Calcul du hascode de la personne partir du nom et du prnom.
iResult = iHashCodePrenom Xor iHashCodeNom
End If
Return iResult
End Function
End Class
Toute classe implmentant une interface doit proposer une implmentation des membres
dfinis dans cette interface. En implmentant linterface gnrique IEqualityComparer(Of Personne),
nous devons donc implmenter les membres :
-
Equals : retourne une valeur boolenne indiquant si deux objets de type Personne reprsente
la mme personne. Ainsi, elle retourne True si les deux personnes passes en paramtre
pointent vers la mme instance ou sils ont le mme nom et le mme prnom.
GetHashCode : permet dobtenir le HashCode de lobjet de type Personne pass en
paramtre, partir de son nom et son prnom.
Voici un bloc dinstructions permettant de crer une liste demploys, puis de lapurer afin
denlever les doublons, et dafficher le nombre demploys obtenus :
19
// VB
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button7.Click
' Cration de la liste des employs.
Dim oListeEmployes As New List(Of Employe) From {
New Employe("ASSIS-ARANTES", "Laurent", 2239.34),
New Employe("ASSIS-ARANTES", "Laurent", 2306.01),
New Employe("DORDOLO", "Matthieu", 1989.99)}
' Suppression des doublons.
Dim oListeEmpl As IEnumerable(Of Employe) =
oListeEmployes.Distinct(New PersonneComparer())
' Affichage du nombre d'employs distincts.
MessageBox.Show(oListeEmpl.Count().ToString() + " employs.")
End Sub
Pour appliquer le concept de la contre-variance prsent ci-dessus, nous avons utilis une
instance de la classe PersonneComparer, permettant de comparer deux personnes, afin de comparer
deux employs. Cette contre-variance est applicable car la classe Employe drive de la classe
Personne.
Lexcution du code ci-dessus affiche la boite de message suivante :
20
8 Conclusion
Ce cours vous a prsent les principales nouveauts du langage Visual Basic 10 :
-
Ces nouveauts vous offriront plus de possibilits dans le dveloppement de vos applications
.NET avec le langage Visual Basic. Attention toutefois au typage dynamique : il est important de ne
pas en abuser, au risque de crer des applications dans lesquelles des exceptions sont souvent
leves