Cet article vise à présenter les différences entre C# et VB.NET et à vous aider, le cas échéant, à choisir entre les deux.
Avant d’analyser les différences existantes entre C# et VB.NET, il est important de rappeler l’historique de ces deux langages.
La première version de Visual Basic (VB) est sortie en 1991. Celle-ci s’inspirait fortement du BASIC mais apportait une révolution à travers son environnement de développement d’interface graphique. Il y a eu 6 versions de VB avant que Microsoft ne sorte le Framework .NET.
En 2002, Microsoft lance le Framework .NET 1.0. Il intègre plusieurs langages dont Visual Basic .NET et C# 1.0. Tous ces langages s’appuient sur le même runtime : la CLR (Common Language Runtime).Cependant, il n’y a pas que la syntaxe qui diffère entre eux.
Depuis VB4, Visual Basic faisait des efforts pour devenir un langage Orienté Objet (OO) avec l’apparition des classes puis des interfaces en VB5. Avec VB .NET, VB est devenu un vrai langage OO avec héritage, polymorphisme, encapsulation, etc…
Le C# quant-à lui apparaît avec le Framework .NET (il s’agit du langage qui a été développé pour .NET), il est très inspiré du langage à la mode du moment : Java. VB étant, pour beaucoup de développeurs, un langage destiné aux débutants (le B de B.A.S.I.C. signifie d’ailleurs Beginner).
En 2008, Microsoft sortira le framework 3.5 avec la 3ème version de C# et la 9ème version de VB.
L’historique est important car il permet d’expliquer certaines « étrangetés » du VB .NET par un problème de compatibilité avec l’existant.
Deux langages bien distincts
C# est devenu le langage phare de Microsoft, le CLR étant d’ailleurs développé avec. VB.NET n’est cependant pas amené à disparaître dans les années à venir. Il y a bien chez Microsoft deux équipes de développement qui font chacune des choix techniques. C’est encore le cas aujourd’hui, chaque langage a ses propres spécificités.
Les délégués anonymes, par exemple, introduits par C#2.0, sont une fonctionnalité qui n’existe pas dans VB .NET 2005, le mot clé « yield » non plus. De même, alors qu’une harmonisation des nouveautés aurait été envisageable, il n’en est rien : « XML Litteral » sera, à priori, spécifique à VB9 et ne devrait pas être supporté par C#3.0. La syntaxe des « extension methods » (méthodes d’extension) avec C#3.0 est radicalement différente de celle de VB9. Pourquoi cela ? Parce que chaque équipe a fait des choix afin de « coller » le plus possible à la philosophie du langage. Si les deux langages étaient identiques, il serait inutile d’en avoir deux.
VB .NET est un langage beaucoup plus verbeux que C#. Les propriétés en lecture seule illustrent bien cela. En C#, il suffit de ne coder que l’accesseur « get ». En VB .NET, il faudra, bien entendu coder l’accesseur « get », mais il faudra également préciser que la propriété est en lecture seule avec le mot clé « ReadOnly ».
L’instruction « for » diffère complètement en VB .NET par rapport à C#. C# a le « for » version « while » qui fait une initialisation, vérifie une condition et fait une instruction. En VB .NET, le « for », c’est celui du BASIC. C’est-à-dire une boucle de telle valeur à telle valeur, avec éventuellement un pas différent de 1 mais la borne max n’est jamais réévaluée. C’est peut-être plus simple mais attention au parcours des éléments d’une liste dont des éléments seraient supprimés dans la boucle.
En bouclant comme ceci :
For index As Integer = 0 To maCollection.Count – 1
Il y a un risque car la propriété « Count » ne sera pas réévaluée.
Citons encore quelques autres différences :
- VB .NET n’est pas sensible à la casse contrairement à C#.
- L’espace de nom des fichiers de ressources est différent : « My.Resources » pour VB .NET. De façon générale, VB .NET possède un espace de nom un peu fourre-tout : l’espace de nom My.
- En VB .NET, le mot clé « Optional » permet de préciser la valeur par défaut d’un paramètre et ainsi de s’en passer à l’appel (dans le cas où la valeur souhaitée soit celle par défaut bien entendu).
- La gestion des espaces de nom est différente (C# fait abstraction de l’assembly contrairement à VB .NET).
- VB .NET permet d’éviter le double typage lors d’une instanciation avec la syntaxe As New. Cet argument perd de son intérêt face à C# 3.0 et les « local variables type inference ». En effet, avec les « local variables type inference », le compilateur va automatiquement déduire le type de l’objet instancié (Object dans l’exemple). Dans l’exemple suivant : var list = new List(); list sera de type List.
- VB ne possède qu’un seul opérateur = contrairement à C# qui possède un opérateur d’affectation et un opérateur d’égalité. De plus en C#, le = (affectation) retourne une valeur, ce qui peut s’avérer pratique.
- L’implémentation des interfaces est différente. En C#, on peut soit déclarer le membre public, soit le déclarer de façon explicite. En VB, il n’y a pas de notion d’implicite / explicite. Il faudra sur chaque membre dire qu’il implémente un membre de l’interface. Le plus de VB, c’est que ce membre pourra être Private (équivalent à explicite) mais aussi Protected, Friend (internal en C#) ou, bien sûr, Public. De plus, en VB, le membre pourra avoir un nom différent de celui de l’interface.
- VB .NET a la notion d’occultation avec le mot clé « Shadows ».
- La distinction entre les propriétés et les méthodes est beaucoup plus claire en C# qu’en VB .NET, notamment dans la gestion des parenthèses.
- Pour définir un « custom event » en VB .NET, il faudra redéfinir les méthodes « AddHandler », « RemoveHandler » et « RaiseEvent. » Alors qu’en C#, il n’est pas possible de redéfinir « RaiseEvent ».
Un des avantages de VB .NET, surtout pour un développeur débutant, repose dans la syntaxe très facile à apprendre et à comprendre. Par exemple l’héritage se définit avec le mot clé « Inherits » (au lieu de « : » en C#). De plus, VB .NET fait la distinction entre l’héritage et l’implémentation d’interface (mot clé Implements) contrairement à C# qui utilise de nouveau « : ».
La syntaxe Function / End Function, If […] Then / End If, très proche d’une écriture algorithme facilite la relecture. En C#, un bloc se ferme systématiquement avec l’accolade fermante, ce qui oblige parfois à réfléchir pour savoir quelle accolade ferme quel bloc.
Les évènements VB .NET ont également un gros avantage sur les évènements C#, avec le mot clé « Handles ». Pour s’abonner à un évènement comme l’évènement « Click » sur un bouton, en C#, il faut passer par un += vers une méthode qui peut se trouver un peu n’importe où dans le code. En VB, il est bien sûr possible d’utiliser le AddHandler mais dans le cas d’un évènement continu, il suffit d’utiliser le mot clé Handles à la fin de la méthode. Cela est particulièrement intéressant pour connaître quels évènements pointent sur la même méthode.
VB .NET (dés)avantagé par son passé
VB .NET se permet, dans certains cas, de ne pas respecter la philosophie OO ainsi que certaines « bizarreries » qui pourront parfois être perçues comme une facilité d’écriture :
- En VB .NET, il est possible d’appeler une méthode statique depuis une instance. Cependant la syntaxe est très particulière :
Ex : s.IsNullOrEmpty(s) avec s une variable de type string “IsNullOrEmpty” est une méthode statique de la classe String.C’est une violation des concepts objets mais c’est aussi un raccourci (c’est d’ailleurs l’intérêt des extensions methods). En revanche, ce type d’écriture peut vite perdre en lisibilité car il est possible d’écrire :
s2.IsNullOrEmpty(s) - Prenons un autre exemple : l’instanciation cachée :
Soit une classe F1 héritant de Form. Alors que la méthode Show n’est pas statique, il sera possible de l’utiliser comme suit :F1.Show()
En réalité, l’instance (unique avec ce type d’appel) est créée dans le namespace MyProject.MyForms. Ce code est caché au développeur. - L’espace de nom « Microsoft.VisualBasic », tout droit sorti de VB6, permet d’appeler une méthode sur un espace de nom :
Ex : Microsoft.VisualBasic.DateDiff([…])
Tout ceci est proscrit par un puriste mais peut-être bien pratique pour un débutant.
De plus, un débutant se servira souvent beaucoup de l’intellisense. Le fait de se voir proposer la méthode IsNullOrEmpty sur son instance de String lui permettra de savoir qu’elle existe.
Dans le cas où le développeur voudrait gérer une instance unique d’une Form, il lui sera plus facile d’utiliser l’instance gérée par Visual Basic que d’utiliser le design pattern singleton.Enfin, il pourra utiliser des méthodes généralistes simplement. Un débutant ne fait souvent pas (à tort ?) de la qualité de son code un aspect prioritaire. Il n’est pas primordial pour lui de savoir si la méthode qu’il appelle est appelée directement sur un espace de nom et / ou si « c’est mal » ce qu’il fait. Dans un premier temps, la plupart des développeurs veulent que ça marche.
Bien entendu, il n’est pas obligatoire de « mal » faire en VB .NET (heureusement !). Il est tout à fait possible de coder aussi proprement qu’en C#, sans déroger aux principes de la programmation OO.
Visual Studio et l’intellisense
L’intellisense avec VB .NET est incontestablement en retard sur celui fourni avec C# (sous Visual Studio).
Avec Visual Studio 2017 :
• L’intellisence VB .NET ne propose pas les mots clés
• La possibilité de faire faire le « Imports » (using en C#) automatiquement après avoir tapé le nom de la classe n’existe pas (ceci sera possible avec Visual Studio 2008)
• Après un « new », l’intellisense VB .NET ne propose pas le type de la variable
• Le « AddHandler » ne propose pas de méthode par défaut contrairement au +=
Le code VB .NET est systématiquement tabulé. Alors que la tabulation par défaut de C# pourra être modifiée.
Un des avantages de VB.NET, en termes d’intellisense, est la fenêtre qui apparait, lors de l’auto-completion : celle-ci est mieux organisée. Alors que la version C# liste, ensemble, les propriétés et méthodes d’un objet, la version VB.NET fournit deux onglets : un pour les propriétés et l’autre pour les méthodes.
En VB .NET, il existe une option de compilation « Strict et Implicit » qui, désactivée, permet au compilateur d’accepter du code moins propre mais plus rapidement écrit.
Conclusion
Pour conclure VB .NET n’est peut-être pas le langage de programmation le plus cool, mais il reste populaire et a maintenant atteint sa position la un de plus élevée sur l’index Tiobe des principaux langages de programmation. Rien que cette année, VB.net a perdu une position contre C # selon l’indice TIOBE de juillet 2019
VB .NET est parfois plus simple pour du code très simple ou pour des développeurs débutants (des mots clés plus explicites, des simplifications parfois au mépris des concepts de la programmation OO), à peu près équivalent la plupartdu temps au C# mais ce dernier est mieux adapté pour faire des choses plus complexes avec notamment un langage plus complet (le mot clé « yield », les délégués anonymes).
Souhaitez-vous savoir, plus largement, quels autres langages de programmation vous devriez envisager d’étudier aujourd’hui?
D’autrement, si vous souhaitez en savoir plus sur les relations entre C# et VB.NET, les gars de Codeproject ont beaucoup de ressources en la matière.
Leave a Reply