# Visual Basic .NET

Visual Basic .NET est un langage de programmation à la syntaxe similaire à celle de Visual Basic 6.
VB.NET permet de développer en .NET via Visual Studio, sur les systèmes d'exploitation Windows (98, 2000, XP, Vista, 7, 8, 8.1, 10 et 11). Comme tout autre langage de la plateforme .NET, VB.NET est compilé vers le langage intermédiaire CIL.

## Les IDE (environnements de développement)

L'IDE commun et incontournable de tous les langages .NET est Visual Studio. Celui-ci est payant (la licence est propriétaire) mais dispose d'une version gratuite pour les développeurs et petites sociétés (CA inférieur à un million de dollars) nommée Visual Studio Community.
Une autre version gratuite existe, limitée à un seul langage : Visual Studio Express.
D'autres IDE gratuits existent, comme SharpDevelop ou MonoDevelop, mais ceux-ci sont moins évolués que Visual Studio.

## Versions
### Évolutions : de VB6 à VB7 (non exhaustif)

Qu'est-ce qui différencie VB6 (Visual Basic 6) par rapport à VB7 (Visual Studio 2003) ? :
* L'orientation objet fait son apparition avec notamment l'intégration de la technologie de l'héritage, qui jusqu'à ce jour limitait l'industrialisation du code Visual Basic (VB6 n'était pas un langage orienté objet à proprement parler).
* L'intégration de l'environnement de développement (IDE) dans la suite Visual Studio permettant d'utiliser d'autres langages comme Visual C++ ou Visual C#. Une bibliothèque de fonction faite en C# sera totalement compatible et utilisable dans une application VB.NET.
* Le code produit par VB.NET est compilé dans un même langage intermédiaire qu'on appelle le CIL (Common Intermediate Language) ou MSIL (Microsoft Intermediate Language). Ce langage est le même que le résultat d'une compilation de C#.
* La connexion aux bases de données est facilitée par l'amélioration des outils de glisser-déposer et l'utilisation de la dernière technologie ADO, ADO.NET.
* La technologie XML est intégrée nativement dans .NET, ce qui permet la création plus facile d'application en ligne ou de sauvegarde de données.
* Le générateur de code SQL est beaucoup plus performant.
* L'écriture de gestionnaires d'erreurs tient compte du Multithreading via des blocs TRY/CATCH.
* La portée des instructions GOTO est limitée (les sauts ne peuvent se faire qu'au sein d'une même fonction). Ce comportement est dû au fonctionnement-même de la plateforme .NET et est commun à tous les langages .NET : C#, J#, etc.
* La déclaration des variables est rendue obligatoire par défaut (contrairement au Visual Basic 6 où cette fonctionnalité était désactivée par défaut).
* L'intégration de nouvelles classes d'objet .NET s'est faite tout en permettant pour les versions intermédiaires de réutiliser les objets .COM rendant la migration plus facile de Visual Basic 6 à VB Net. VB.NET est le seul langage de .NET à avoir une intégration « en profondeur » des objets COM.
* Les pointeurs vers des fonctions peuvent et doivent (dans 99 % des cas) désormais être typés (notion de délégués).

### Évolutions : VB7 à VB8 (non exhaustif)

Quelques nouveautés ont fait leur apparition entre VB7 et VB8, mais c'est surtout le passage du framework .NET 1.1 au 2.0 qui marque cette évolution.
En voici tout de même un résumé :
* Les classes partielles, permettant de répartir l’implémentation d’une classe sur plusieurs fichiers.
* Les types génériques, évolution typée des templates C++.
* Les types « nullables », c'est-à-dire la possibilité de spécifier qu’un type de valeur peut être nul. Ceux-ci sont déclarés avec le caractère point d'interrogation « ? » suivant le nom du type, comme ceci : Dim X as Integer? = Nothing (VB9) ou avec une classe particulière (VB8+). Cette valeur « Nothing » serait, si le « ? » n'était pas spécifié, converti en 0 dans ce cas-ci. Dans le nouveau système, (X+10) vaudrait « Nothing » (Nothing est absorbant dans tous les opérateurs), et pas 10 comme cela aurait été le cas autrement. Tout membre d'une valeur « vide » est « vide ».
* La documentation est automatiquement générée depuis des commentaires spéciaux dans le code.

### Évolutions : VB8 à VB9 (non exhaustif)

VB9 a évidemment implémenté toutes les nouvelles fonctionnalités de C#, ainsi que quelques autres :
* LINQ, XLINQ, DLINQ…
* Expression Trees (fonctions anonymes)
* Assouplissement des conversions entre délégués
* XML Littéral
* Introduction du IF ternaire (équivalent de bool?truePart:falsePart), optimisé par rapport à IIF
* La migration du code VB6 vers .NET, et la rétro-compatibilité avec ce langage (Classe VB6) ont été retirés.

### Évolutions : VB9 à VB10

VB10 (aussi appelé VBx) marque un tournant majeur dans l'évolution de VB. Outre le fait qu'il sera intégré dans le Framework 4, il devrait surtout combler totalement son "retard" par rapport à C# sur certains points (tout comme C# comblera son retard envers VB), vu que la "coévolution" des langages C# et VB.NET a été officiellement annoncée. Cela assure non seulement un futur stable à VB.NET, qui ne pourra pas être délaissé par Microsoft mais aussi une garantie que tout ce qui est faisable en C# le sera toujours aussi sous VB.NET (même si c'est d'une autre façon).
Les fonctionnalités prévues pour VBx :
* Objets dynamiques (permet notamment la Programmation orientée prototype et la communication entre des langages dynamiques (JScript…) et les langages de la plateforme .NET)
* Gestion implicite des interfaces (comme C#)
* Gestion des méthodes anonymes
* Simplification de l'écriture des tableaux, collections, listes et dictionnaires.

## Quelques différences entre C# et VB.NET (non exhaustif)

Voici les différences les plus flagrantes entre VB.NET et C# (VB.NET et C# évoluant, les éléments de cette liste peuvent être obsolètes):
* VB supporte les paramètres optionnels (C# ne le supporte que depuis sa version 4)
* VB supporte le "late-binding" (appel d'une propriété/fonction avec son nom, sans connaitre le type de l'objet (pour les objets COM))
* L'espace de nom Microsoft.VisualBasic donne une compatibilité par rapport à VB6. Il est à éviter si une solution plus performante existe.
* L'espace "My" implémente de nombreux appels WMI ou d'IO, ainsi que plusieurs "raccourcis" dans la gestion des ressources et paramètres d'applications. (VB8+)
* VB supporte la structure With
* Gestion des évènements simplifiée dans les fenêtres et contrôles
* On peut définir une méthode d'interface avec un nom différent que celui proposé au départ (si on veut redéfinir une fonction dans la classe avec un même nom mais une action différente)
* Support du mot-clé When dans le bloc Catch (exemple : Catch ex as ComException When ex.ErrNumber = 30)
* XML Littéral n'est pas implémenté en C#.
* Les Custom Events ne sont pas implémentés en C#.
Une liste des différences (en 2005) entre C# et VB.NET plus complète existe ici.

## Quelques exemples de code en VB.NET
### Gestion des exceptions

VB.NET possède les instructions try et catch permettant de gérer les exceptions (comportement non attendu des instructions du programme).
Exemples :

### Exemple d'un code appelant une fonction
## Identité visuelle

* Ancien logo.
* Logo actuel.