Droit de diffusion:
L'ensemble ou partie de ce document ainsi que le code mis à disposition, ne peut être
diffusé sur d'autres sites Web sans l'autorisation au préalable de ses créateurs.
Avant Propos : Ce document a pour but de
présenter la technologie .NET rapidement, afin de faciliter le passage de VB6 à VB.NET ou C#.
Pour ceux qui ne le savent pas encore .NET est une nouvelle technologie propriétaire inventée par
Microsoft. Cette technologie a pour but de remplacer à terme tous
les langages utilisés par Microsoft dont Visual Basic et le C++ avec
la MFC. Pour ceux qui ont déjà fait du Java, vous ne serez pas perdu
en C#. Vous trouverez des renseignements précis sur cette
technologie sur
http://www.microsoft.com/france/net/
Sommaire:
1. La migration des programmes VB6 en VB.NET
2. Les différences dans la façon de programmer
2.1 Les méthodes
2.2 Les fonctions
2.2 Les formulaires
3. Les objets
4. Les tableaux et collections
4.1 Les tableaux
4.2 Les collections
5. Que deviennent les modules ?
6 . Différence entre VB.NET et C#
1. La migration des programmes VB6 en VB.NET :
Avant de vous lancer dans la migration de VB6 à VB.NET, vous devez bien comprendre à quoi sert
.NET et quels sont ses avantages et inconvénients. Pour cela je vous
renvoie à la FAQ .NET.
Je ne vais pas dire que la migration est impossible car je mentirai. Mais vous devez savoir
qu'elle est extrêment longue. Pour prendre un petit exemple vos tableaux, collections sont à
revoir à cause des indices de début. Vos modules de classes ne sont plus bons et doivent être modifiés.
Plein de petites choses de ce style, qui ne sont pas complexes mais extrêmement longues à faire.
Donc il est beaucoup plus sage de redévelopper l'application que d'essayer de la migrer. Vous
trouverez sur le forum d'entraide
un sujet traitant de ce point :
http://www.developpez.net/forums/viewtopic.php?t=25019
La technologie .NET est une technologie orientée 100% objet. C'est une des raisons qui font que
la migration est très longue et demande un nombre important de modifications.
Sur le point de vue professionnel, les licenses Visual Basic 6 ne sont plus vendues,
vous ne trouverez que des licenses .NET. Cela veut dire que si votre
société décide d'acheter de nouvelles licenses, alors vous devrez
passer à .NET (ce qui n'est pas mauvais entre nous soit dit). Le
plus génant est que les développeurs doivent programmer à la fois en
VB6 pour la maintenance et .NET pour les nouveaux projets. Le
passage à VB.NET est plutôt facile pour ceux qui connaissent la
notion d'objet. Vous pourrez enfin avoir plusieurs constructeurs
pour vos formulaires et donc passer des paramètres à sa création.
Quant à ceux n'ayant jamais fait de programmation objet, le passage
va être un plus rude. Mais ne vous inquiétez pas, ce n'est pas si
sorcier que ça. La notion d'objet vous sera de plus en plus claire
au fur et à mesure de vos développements.
Mais qu'en est il exactement de vos habitudes de programmation ?
2. Les différences dans la façon de programmer :
Comme je l'ai dit précédemment la grosse différence est la programmation objet. Dès le départ quand
vous créez un formulaire vous verrez que votre formulaire est une classe. Afin que vous voyez mieux la
différence de programmation je vais donner des exemples en VB6, VB.NET et C#. Microsoft a fait le
choix de laisser des fonctions VB6 dans le langage VB.NET. Entre autre vous retrouverez votre MsgBox préférée.
MAIS je vous déconseille de l'utiliser afin de ne pas prendre de mauvaises habitudes en VB.NET.
Dans le paragraphe VB.NET vs C#, je vous expliquerai pourquoi il ne faut pas réutiliser ces fonctions. Donc
pour afficher un message vous utiliserez désormais MessageBox.Show("VotreMessage"). Il en est de même pour toutes les
fonctions sur les chaînes de caractères.
2.1. Les Méthodes
Comme sous .NET tout est objet, vos types sont des classes. Pour le type String vous retrouverez
toutes les fonctions en tant que méthodes de la classe. Certains d'entre vous doivent se demander
ce que je raconte. Voici un petit exemple simple :
Visual Basic 6
Visual Basic .NET
C#
Vous voyez que ce n'est pas compliqué. La fonction UCase utilisée en VB6 est remplacée par la
méthode ToUpper() de la classe String en .NET. Avec l'IDE Visual
Studio .NET, lorsque vous tappez "str." vous voyez apparaître la
liste des méthodes et propriétés de l'objet, dans notre cas str.

Vous n'avez plus besoin de chercher dans l'ensemble des fonctions
travaillant sur les chaînes de caractères car il vous suffit de
regarder les membres de la classe string. Comme vous pouvez le voir la
différence entre VB.NET et C# n'est pas si grande que ça. Ce n'est
pas toujours aussi ressemblant.
Pour ceux qui est de vos propres méthodes il n'y a pas de changement :
Visual Basic 6
Visual Basic.NET
C#
Dans cet exemple vous pouvez constater que je n'ai utilisé qu'un seul caractère comme séparateur
car la fonction Split sous .NET ne prend en compte q'un seul
caractère comme séparateur, mais peut prendre plusieurs séparateurs
comme paramètre. Sous VB6 vous pouviez mettre une chaîne de
caractères comme spérateur. Voici une des petites différences qui
posent généralement des soucis lors de la migration.
2.2. Les Fonctions
Pour les fonctions c'est un peu différent. Un nouveau mot clé est apparu qui est le
return.
Visual Basic 6
Visual Basic.NET
C#
Pour le retour des fonctions, le choix c'est porté sur une solution équivalente au C/C++.
Une chose importante à savoir pour le passage par paramètre :
contrairement à VB6 où les paramètres sont passés par référénce par défaut, en .NET les
paramètres sont passés par valeur. Le mot clé ByRef
pour VB.NET et ref pour le C# permettent le passage par référence.
Petite chose à savoir aussi, en VB6 et VB.NET vous pouvez utiliser des paramètres optionnels (c'est
à dire que vous n'êtes pas obligé de les renseigner au moment de l'appel de la méthode ou fonction) et non en C#.
2.3. Les formulaires
La plus grosse différence lors du développement en .NET est l'architecture du fichier source. Voici le
code d'un formulaire vide :
Visual Basic 6
Visual Basic.NET
C#
Il apparaît clairement que des changements ont eu lieu. Pour ceux ayant déjà programmé en C++, cela
vous semble familier. N'ayez pas peur, ce code est généré automatiquement.
Votre application est un assemblage d'objets (FAQ .NET)
dont votre formulaire fait partie. Un objet est une instance de classe. La classe permettant
d'avoir un formulaire est la classe System.Windows.Forms.Form. Quand vous tappez
Public Class Form1 Inherits System.Windows.Forms.Form cela veut dire que vous
créez une classe ayant pour modèle le formulaire standard. Votre
classe porte le nom de Form1. C'est comme si vous faisiez un module
de classe en VB6 hors mis le fait que dans le code vous dites que
c'est une classe. Vous retrouvez le New qui correspond au
constructeur et le Finalize qui est le destructeur. Attention avec
le Finalize car certaines classes possèdent une méthode Dispose qui
détruit l'objet. Je traiterai cela dans le prochain chapitre Les objets.
3. Les objets :
Voilà le terme qui désormais vous verrez partout : OBJET ou
CLASSE. Même si pour vous la programmation objet est une programmation avec beaucoup de
contraintes vous allez vous apercevoir rapidement que ces
contraintes n'en sont pas ou plutot qu'elles n'en seront plus. Une
grande différence avec VB6 est la notion de namespace (espace de
nom). Qu'est ce qu'un espace de nom? Un espace de nom permet de
regrouper plusieurs classes. Par exemple pour tout ce qui est du
traitement avec des bases de données vous devez utiliser le
namespace System.Data. Dans ce dernier vous trouverez un ensemble de classes et d'autres namespace tel que
le namespace OleDb qui permet de réaliser une connexion à une base de données et d'effectuer des
requêtes SQL. Vous travailliez déjà un peu de cette façon sous VB6
quand vous rajoutiez une référence afin de pouvoir déclarer votre
objet. Sous .NET tout ça a été regroupé dans ce qu'on appelle un framework. Vous pouvez tout de
même rajouter de nouveaux composants .NET ou bien utiliser vos ActiveX.
Nous allons voir comment déclarer une classe et les changements que vous devez faire pour passer de
VB6 à VB.NET.
Visual Basic 6
Dans le cas de Visual Basic 6 vous devez ajouter un module de classe à votre projet.
Visual Basic.NET
Sous Visual Basic .NET vous devez ajouter une classe.
C#
Sous C# vous devez ajouter une classe comme
en VB.NET. Par contre les propriétés vues ci-dessus portent le nom d'accesseurs.
Comme vous le remarquez, on se rapproche beaucoup du C++ même en VB.NET. Quant à la différence
entre VB.NET et C# elle est tout de même minime. Mais ce qui nous
intéresse c'est plus de VB6 à VB.NET. En fait ce qui demande le plus
de travail c'est l'utilisation du mot clé Property. Hors mis cela,
la migration se fait sans trop de difficultés.
4. Les tableaux et les collections :
4.1. Les Tableaux
a) Déclarations tableaux simples
En VB.NET les tableaux ont aussi connu des
modifications importantes par rapport à VB6. La principale raison de
ces changements est l'abandon de la structure variant_array qui
permettait des déclarations de tableaux assez « exotiques » comme
par exemple :
Dim MonTableau (15 to 30)
|
Maintenant sur l'ensemble des langages de .NET, les tableaux commencent
tous par l'indice 0 et possèdent un nombre défini d'éléments typés. En VB.NET, lorsqu'un tableau est
déclaré, la définition est basée sur la limite supérieure du tableau
et non pas sur le nombre d'éléments qu'il contient. Par exemple, un
tableau déclaré :
Visual Basic.NET
contiendra 11 éléments compris entre MonTableau(0) et MonTableau(10).
C#
contiendra 10 éléments compris entre MonTableau[0] et MonTableau[9].
Pour ce qui est de la manipulation de ces tableaux, vous retrouverez la plupart
des fonctionnalités de VB6 en VB.NET mais pas en C#.
b) Déclarations tableaux multidimensionnels
Voici comment se déclare un tableau multidimensionnel :
Visual Basic.NET
On a donc ici l'exemple d'un tableau à 2
dimensions composé de 16 cases commençant à Montableau(0,0) et se
terminant à MonTableau(3,3).
C#
En C# on obtient un tableau de [0,0] à [2,2]
dans le premier cas et de [0][0] à [2][2] dans le deuxième cas.
Certains d'entre vous se demandent sans doute quelle est la
différence entre [ , ] et [ ][ ]. Le premier représente un tableau
multidimensionnel de même type. Le deuxième représente un tableau en
escalier (terme utilisé par Microsoft). Dans notre cas nous avons le
même type sur les deux dimensions mais vous pouvez avoir un type
différent par dimension. Voici un petit exemple :
C#
Le principe est le même pour un tableau à trois dimensions :
Visual Basic.NET
et ainsi de suite...
c) Fonction UBound
Cette fonction permet d'obtenir la limite
supérieure d'un tableau. Par exemple un tableau déclaré :
Visual Basic.NET
C#
Ce tableau contient 3 éléments (0, 1, 2) et
va de MonTableau4(0) à MonTableau4(2).
UBound(MonTableau4) retourne l'entier 2 : l'indice de l'extrémité de MonTableau4.
Nota : il existe une fonction LBound() qui permet de connaître la limite inférieure du
tableau. Mais comme tous les tableaux de VB.NET commencent par
l'indice 0 cette fonction ne présente pas un grand intérêt ;)
d) Fonction ReDim
Cette fonction n'est disponible que sous
VB.NET. Comme nous l'avons vu précédemment, les tableaux doivent
posséder un nombre fini d'éléments. Pourtant, le nombre d'éléments
que contiendra un tableau peut-être défini après sa déclaration
grâce à l'instruction ReDim. On peut ainsi déclarer un tableau :
Visual Basic.NET
Cependant, si vous déclarez un tableau comme
ci-dessus, ce tableau n'est pas instancié. Si un essai était réalisé
pour affecter une valeur à ce tableau, une exception serait levée,
alors que l'instruction ne pose aucun problème à la compilation. On
remarquera quelques changements lors de l'utilisation de
l'instruction ReDim par rapport à VB6 :
- Vous ne pouvez pas utiliser ReDim pour la
déclaration initiale de la variable, vous devez d'abord déclarer
cette variable avec Dim comme vu précédemment.
- Vous ne pouvez pas changer le nombre de
dimensions du tableau : un tableau déclaré en 2 dimensions avec
Dim restera en 2 dimensions.
Ainsi on aura :
Visual Basic.NET
L'instruction ReDim
effacera l'ensemble des valeurs de votre tableau avant de le
redimensionner. Si vous voulez que les valeurs de votre tableau
soient conservées il faut utiliser l'instruction Preserve :
Visual Basic.NET
Si vous rétrécissez la taille de votre
tableau ReDim Preserve effacera seulement les données qui se
situeront hors des bornes de votre nouveau tableau.
Les tableaux sont toujours très puissants en
VB.NET, et ils permettent de satisfaire la plupart des besoins.
Cependant, la classe de base des tableaux reste assez rudimentaire.
Pour réaliser des tâches plus avancées comme le tri ou les systèmes
de pile, la classe de base Array a été héritée par les classes de
l'espace de nom collection.
4.2. Les collections
L'espace de nom collection fait partie de
l'espace de nom system. Il fournit une série de classes qui
permettent d'utiliser des fonctionnalités de tableaux avancés comme
trier naturellement ou ajouter dynamiquement des objets dans un
tableau. Nous allons voir brièvement les 4 classes principales qui
composent l'espace de nom collection.
a) ArrayList
ArrayList permet d'implémenter un tableau
dont la taille croit automatiquement au fur et à mesure que des
éléments y sont ajoutés. Une collection du type ArrayList peut
contenir n'importe quel type d'objets. Voici un petit exemple :
Visual Basic.NET
C#
ArrayList collection1 = new ArrayList();
object MonObjet;
int MonEntier = 1;
string MaChainne = "Hello";
Collection1.Add(MonObjet);
Collection1.Add(MonEntier);
Collection1.Add(MaChainne); |
Comme on peut le voir dans cet exemple, une
collection du type ArrayList permet d'ajouter tout type d'objet à la
collection. Pour récupérer une valeur dans une collection du type
ArrayList, on utilisera la syntaxe : Collection1.Item(1)
b) BitArray
La collection BitArray gère un tableau de
booléens qui sont stockés sous la forme de bits. Lors de la
déclaration, comme pour les tableaux il faut définir la taille de la
collection : soit lors de la déclaration, soit lorsqu'on instancie
la classe. On a donc :
Visual Basic.NET
C#
On ne peut affecter des valeurs à la
collection qu'une fois qu'elle a été instanciée par un New,
sinon, une exception sera levée. La syntaxe pour affecter une valeur à une collection du type
BitArray est : TableauBool.Item(0) = True
c) Queue
Implémente une collection FIFO, appelée
"premier entré premier sorti", ou file. Tout comme les collections
du type ArrayList, la taille d'une collection du type Queue croit
automatiquement, et on y peut stoker n'importe quel type d'objet.
Dans l'exemple ci-dessous nous nous contenterons d'une Queue
d'entiers pour montrer la syntaxe et les méthodes de base.
Visual Basic.NET
C#
DeQueue() retournera et supprimera l'élément
d'indice «0» de la collection car c'est le premier entré dans la
file.
Note : On ne pourra pas récupérer un objet
se trouvant dans une collection du type Queue avec un index. Si vous
voulez récupérer les objets d'une collection avec un index il faut
utiliser la classe ArrayList décrite un peu plus haut.
d)Stack
Implémente une collection de type LIFO,
appelé "dernier entré, premier sorti" ou pile. Tout comme les
collection du type ArrayList ou Queue la taille d'une collection du
type Stack croit automatiquement, et y on peut stoker n'importe quel
type d'objet. Dans l'exemple ci-dessous nous nous contenterons d'une
Stack d'entier pour montrer la syntaxe et les méthodes de base.
Visual Basic.NET
C#
Pop() retournera et supprimera l'élément
d'indice «3» de la collection car c'est le dernier entré dans la
pile.
Note : On ne pourra pas récupérer un objet
se trouvant dans une collection du type Stack avec un index. Si vous
voulez récupérer les objet d'une collection avec un index il faut
utiliser la classe ArrayList décrite un peu plus haut.
Nous venons de voir les 4 classes les plus
utilisées de l'espace de nom Collection. Mais cet espace de nom
contient d'autres classes qui peuvent permettre de faire face à
d'autres situations, citons entre autres, les classes HashTable et
SortedList qui permettent de trier et d'accéder aux valeurs de la
collection avec des clés. Comme nous venons de le voir, dans VB.NET,
les classes de l'espace de nom Collection complètent parfaitement
les tableaux.
5. Que deviennent les modules ?
Sous .NET vous pouvez toujours
utiliser vos chers et tendres modules, mais pour une question de
clarté je vous conseille de passer vos modules en objets. Si vous
devez faire de l'objet autant bien en faire. Ce chapitre vous
guidera dans la réalisation des classes à partir de vos modules. La
méthode est assez personnelle, donc vous pouvez l'adapter ou même
l'améliorer.
Normalement vous avez dû créer un
module par groupe de fonctionnalités. Par exemple toutes les
traitements sur la base de données sont dans un module, tous les
traitements concernant votre métier sont dans un autre voir
plusieurs autres. Si ce n'est pas le cas, vous devez commencer par
bien séparer chaque partie de votre application. Si possible séparer
le code l'IHM (Interface Homme-Machine) du code concernant
l'applicatif. Pourquoi cette séparation ? Cela vous permettra de
faire évoluer votre application plus facilement ou bien de modfifier
vos formulaires au goût de l'utilisateur sans avoir à retoucher à
tout ce qui est applicatif.
Prenons un exemple simple : la
connexion à une base de données. D'un côté vous faites une fenêtre
dans laquelle l'utilisateur saisit son nom et son mot de passe. De
l'autre vous avez prévu une classe gérant les accès à la base de
données. Dans le code de votre fenêtre vous avez juste à mettre
maConnexion.Connect(...). Si un jour on vous dit la fenêtre me plait
pas du tout je voudrais quelque chose dans ce style. Votre
développement sera beaucoup plus rapide car vous n'aurez pas besoin
de rechercher dans le code de votre fenêtre la phase de connexion et
la mettre de côté pour pouvoir recoller ce morceau de code dans la
nouvelle fenêtre. Si vous séparez bien vos traitements alors :
- Vous pourrez effectuer une maintenance
beaucoup plus facilement
- Vous pourrez réutiliser votre ailleurs
Quand on vient d'un langage comme VB6 il est
assez difficile de "penser objet". Mais vous verrez qu'une fois ce
cap franchi faire marche arrière est rudement désagréable. Rentrons
dans le vif afin de savoir quoi faire avec tous ces modules.
Comme je l'ai dis plus haut, la première
phase est de bien séparer vos variables, fonctions, méthodes afin de
créer des classes cohérentes. Ensuite vous devez regarder si toutes
vosvariables globales sont utiles. Je rappelle qu'avec .NET vous
pouvez avoir plusieurs constructeurs et des paramètres dans ces
derniers. Donc si vous avez une variable globale dans votre Form1
afin que la Form2 puisse y accéder alors mettez là en private puis
créer un constructeur dans votre Form2 qui prendra comme paramètre
l'élément. Un petit exemple :
Visual Basic 6
Form1 :
Form2 :
Visual Basic.NET
Form1 :
Form2 :
Je ne donne pas d'exemple pour le
C# car c'est exactement la même méthode que pour VB.NET.
Les variables globales liées à
votre application (c'est à dire nécessaires à tous les éléments)
vous pouvez les encapsuler dans une classe que vous appellerez
MonApplication. Evitez d'utiliser le nom Application car c'est une
classe déjà existante, elle correspond à App sous VB6. Dans la
classe MonApplication vous déclarez vos variables en public
ou alors vous utilisez les Property
(les accesseurs en C#). Si une variable ou fonction
est déclarée Static alors elle est commune à l'ensemble des
instances de la classe. Donc je vous conseille de déclarer tous vos
éléments de votre classe MonApplication en Static.
Il ne nous reste plus qu'à voir
les fonctions et méthodes présentes dans vos modules. Pour commencer
triez les afin de créer des classes d'outils. Dans chacune de vos
classes vous mettrez vos fonctions et méthodes. Vous aurez juste une
modification à réaliser c'est mettre Shared à la place de Public. A quoi ça
sert ? Comme sous .NET vous travaillez uniquement avec des objets,
vous êtes normalement obligé de créer un objet pour pouvoir accéder
aux membres décrits dans la classe. Grâce au mot clé Shared vous n'aurez pas besoin de
faire de "New MaClasse" pour pouvoir utiliser la fonction. Faîtes un
petit test chez vous. Créer deux classes, une avec les méthodes en
Public l'autre en Shared. Ensuite dans une autre classe vous faîtes
MaClasse1. et vous verrez que
vos méthodes n'apparaissent pas alors qu'avec MaClasse2 elles
apparaissent. Je vous mets tout de même en garde avec l'utilisation
du mot clé Shared qui spécifique à un traitement réalisé UNIQUEMENT
sur l'élément passé en paramètre.
Vous voilà prêt(e) à migrer de
VB6 à VB.NET sans trop être perdu(e).
6. Différence entre VB.NET et C#
Vous ne trouverez pas la liste
exhaustive des différences mais celles qu'on a pû rencontrer. En
effet beaucoup de personnes ont déjà des avis qui ne sont pas
toujours vrais. Pour réaliser au mieux cette partie, nous l'avons
réalisé à trois : un développeur ASPX, un développeur C# et un
développeur VB.NET. Ainsi nous avons une vue plutôt objective sur
les différences entre ces deux langages. Nous mettrons cette partie
à jour dès que nous trouvons de nouvelles différences.
Pour la pluspart des applications
réalisées en .NET il est possible de la faire aussi bien en VB.NET
qu'en C#. La première différence est le langage. Les adeptes de
C++/Java se sentiront plus à l'aise sur C# alors que ceux venant de
VB6 seront moins perdus avec VB.NET.
La deuxième différence apparaît
sur l'utilisation du code non managé. Celà n'est possible qu'en C#.
Les adeptes des pointeurs peuvent toujours en faire en C#. Mais ce
n'est utilisé que pour pouvoir travailler avec des DLL non managées. Si par cas vous
devez utiliser absolument des pointeurs n'oubliez pas de mettre le
mot clé unsafe dans le prototype de votre fonction.
Le compilateur réagit différemment sur les
deux langages. Prenons un petit exemple. Ne chercher pas à
comprendre l'exemple car c'est juste un test pour voir la réaction du compilateur.
Visual Basic.NET
Sous VB.NET il n'y a pas d'erreur, même pas de warning. La compilation se passe très bien.
C#
Voici le code similaire en C# :
System.AppDomain app;
int i = 4;
if(i==1) {
app = System.AppDomain.CurrentDomain;
} else if (i==3)
{ app= null;
}
MessageBox.Show(app.BaseDirectory);
|
Ici le compilateur donne une
erreur : Utilisation d'une variable locale
non assignée 'app'
Méfiez vous des programmes
permettant de migrer d'un langage à un autre car vous pouvez vous
retrouvez avec des cas comme celui-ci. Ceci dit le compilateur C#
n'a pas tord. Donc les programmeurs VB.NET faites attention à ce
genre de cas.
Remarque : Il est tout à fait possible qu'il y
ait des erreurs dans le document. Si vous en trouvez, ou bien
souhaitez un peu plus d'explication sur certains points, veuillez
m'envoyer un message privé via le forum afin de mettre à jour
l'ensemble de ce document. D'avance merci.
Document réalisé par Sébastien Curutchet et neo.51 |