Les premiers pas
Dans cette page, nous examinerons la terminologie de base de la programmation et nous écrirons notre premier programme C#. Nous nous familiariserons avec la programmation, ce qu'elle signifie et son lien avec les ordinateurs et les langages de programmation. Nous passerons brièvement en revue les différentes étapes du développement logiciel. Nous présenterons le langage de programmation C#, la plateforme .NET et les différentes technologies Microsoft utilisées dans le développement logiciel. Nous examinerons les outils dont nous avons besoin pour programmer en C#. Nous utiliserons le langage de programmation C# pour écrire notre premier programme informatique, le compiler et l'exécuter à partir de la ligne de commande ainsi que depuis l'environnement de développement intégré Visual Studio. Nous passerons en revue la bibliothèque MSDN, la documentation du .NET Framework et .NET Core. Elle nous aidera dans notre exploration des fonctionnalités de la plateforme et du langage de programmation.
Que signifie « programmer » ?
De nos jours, les ordinateurs sont devenus irremplaçables. Nous les utilisons pour résoudre des problèmes complexes sur le lieu de travail, pour rechercher des itinéraires, pour nous amuser et pour communiquer. Ils ont d'innombrables applications dans le monde des affaires, l'industrie du divertissement, les télécommunications et la finance. Il n'est pas exagéré de dire que les ordinateurs construisent le système neuronal de notre société contemporaine et qu'il est difficile d'imaginer son existence sans eux. Malgré le fait que les ordinateurs soient si répandus, peu de gens savent comment ils fonctionnent réellement. En réalité, ce ne sont pas les ordinateurs, mais les programmes (les logiciels) s'exécutant sur eux comptant. Ce sont les logiciels rendant les ordinateurs précieux pour l'utilisateur final, permettant de nombreux types de services différents changeant nos vies.
Comment les ordinateurs traitent-ils les informations ?
Pour comprendre ce que signifie programmer, nous pouvons comparer un ordinateur et son système d'exploitation à une grande usine avec tous ses ateliers, ses entrepôts et ses moyens de transport. Cette comparaison approximative permet d'imaginer plus facilement le niveau de complexité présent dans un ordinateur contemporain. De nombreux processus s'exécutent sur un ordinateur et ils représentent les ateliers et les lignes de production d'une usine. Le disque dur, ainsi que les fichiers qu'il contient, et la mémoire vive (RAM) représentent les entrepôts, et les différents protocoles sont les systèmes de transport, qui assurent l'entrée et la sortie des informations.
Les différents types de produits fabriqués dans une usine proviennent de différents ateliers. Ils utilisent les matières premières des entrepôts et y entreposent les produits finis. Les matières premières sont transportées vers les entrepôts par les fournisseurs et le produit fini est transporté des entrepôts vers les points de vente. Pour ce faire, différents types de transport sont utilisés. Les matières premières entrent dans l'usine, passent par différentes étapes de traitement et quittent l'usine transformées en produits. Chaque usine transforme les matières premières en un produit prêt à être consommé.
L'ordinateur est une machine de traitement de l'information. Contrairement à l'usine de notre comparaison, pour l'ordinateur, la matière première et le produit sont la même chose : l'information. Dans la plupart des cas, les informations d'entrée sont extraites de n'importe quel entrepôt (fichiers ou mémoire vive) vers lequel elles ont été préalablement transportées. Ensuite, elles sont traitées par un ou plusieurs processus et en ressortent modifiées sous la forme d'un nouveau produit. Les applications Web en sont un parfait exemple. Elles utilisent HTTP pour transférer les matières premières et les produits, et le traitement de l'information consiste généralement à extraire le contenu d'une base de données et à le préparer pour la visualisation sous forme de HTML.
Gestion de l'ordinateur
L'ensemble du processus de fabrication des produits dans une usine comporte de nombreux niveaux de gestion. Les machines et les chaînes de montage sont gérées par des opérateurs, les ateliers par des directeurs et l'usine dans son ensemble est dirigée par des cadres dirigeants. Chacun d'entre eux contrôle les processus à un niveau différent. Les opérateurs de machines sont au niveau le plus bas : ils contrôlent les machines à l'aide de boutons et de leviers. Le niveau suivant est réservé aux chefs d'atelier. Et au niveau le plus élevé, les cadres dirigeants gèrent les différents aspects des processus de fabrication dans l'usine. Ils le font en émettant des ordres.
Il en va de même pour les ordinateurs et les logiciels : ils comportent de nombreux niveaux de gestion et de contrôle. Le niveau le plus bas est géré par le processeur et ses registres (cela est accompli en utilisant des programmes de machine à un niveau bas) - nous pouvons comparer cela au contrôle des machines dans les ateliers. Les différentes responsabilités du système d'exploitation (Windows 7 par exemple), comme le système de fichiers, les périphériques, les utilisateurs et les protocoles de communication, sont contrôlées à un niveau supérieur - nous pouvons comparer cela à la gestion des différents ateliers et départements de l'usine. Au niveau le plus élevé, nous pouvons trouver le logiciel d'application. Il gère tout un ensemble de processus qui nécessitent une quantité énorme d'opérations de traitement. C'est le niveau des cadres généraux gérant toute l'usine afin de maximiser l'utilisation des ressources et de produire des résultats de qualité.
L'essence de la programmation
L'essence de la programmation est de contrôler le travail de l'ordinateur à tous les niveaux. Cela se fait à l'aide d'«ordres» et de «commandes» du programmeur, également appelés instructions de programmation. «Programmer» signifie organiser le travail de l'ordinateur à travers des séquences d'instructions. Ces commandes (instructions) sont données sous forme écrite et sont implicitement suivies par l'ordinateur (respectivement par le système d'exploitation, le processeur et les périphériques).
Une séquence d'étapes pour réaliser, terminer un travail ou obtenir un résultat est appelée un algorithme. C'est ainsi que la programmation est liée aux algorithmes. La programmation consiste à décrire ce que l'on veut que l'ordinateur fasse par une séquence d'étapes, par des algorithmes.
Les programmeurs sont les personnes créant ces instructions, contrôlant les ordinateurs. Ces instructions sont appelées programmes. De nombreux programmes existent et ils sont créés à l'aide de différents types de langages de programmation. Chaque langage est orienté vers le contrôle de l'ordinateur à un niveau différent. Il existe des langages orientés vers le niveau machine (le plus bas) - l'assembleur par exemple. D'autres langages sont plus utiles au niveau du système (en interaction avec le système d'exploitation), comme le C, le Pascal, Modula-2 et l'Oberon. Il existe également des langages de haut niveau utilisés pour créer des programmes d'application. Parmi ces langages, on trouve C#, Delphi, Java, C++, PHP, Visual Basic, Python, Ruby, Perl, JavaScript et d'autres.
Les instructions données sous forme de programmes écrits en C# peuvent accéder et contrôler presque toutes les ressources de l'ordinateur directement ou via le système d'exploitation. Avant d'apprendre à écrire des programmes simples en C#, examinons de plus près les différentes étapes du développement logiciel, car la programmation, bien qu'elle soit l'étape la plus importante, n'est pas la seule.
Les étapes du développement logiciel
L'écriture d'un logiciel peut être une tâche très complexe et chronophage, impliquant toute une équipe de développeurs ou de spécialiste logiciels et d'autres spécialistes. En conséquence, de nombreuses méthodes et pratiques, facilitant la vie des programmeurs, ont vu le jour. Tout ce qu'elles ont en commun est que le développement de chaque produit logiciel passe par plusieurs étapes différentes :
- Recueil des exigences du produit et création d'une tâche;
- Planification et préparation de l'architecture et de la conception;
- Mise en oeuvre (incluant la rédaction du code du programme);
- Essais du produit (tests);
- Déploiement et exploitation;
- Support.
La mise en oeuvre, les tests, le déploiement et le support sont principalement réalisés à l'aide de la programmation.
Recueil des exigences
Au début, seule l'idée d'un produit donné existe. Elle comprend une liste d'exigences définissant les actions de l'utilisateur et de l'ordinateur. Dans le cas général, ces actions facilitent les activités déjà existantes : le calcul des salaires, la conversion de mesures, le calcul des trajectoires balistiques ou la recherche du chemin le plus court sur Google Maps en sont quelques exemples. Dans de nombreux cas, le logiciel implémente une fonctionnalité jusqu'alors inexistante, comme l'automatisation d'une certaine activité.
Les exigences du produit sont généralement définies sous forme de documentation. Aucune programmation n'est effectuée à ce stade. Les exigences sont définies par des experts connaissant les problèmes d'un certain domaine. Ils peuvent également les rédiger de manière à ce qu'elles soient faciles à comprendre par les programmeurs. Dans le cas général, ces experts ne sont pas des spécialistes de la programmation, mais des analystes commerciaux.
Planification et préparation de l'architecture et de la conception
Une fois toutes les exigences rassemblées, vient l'étape de planification. À ce stade, un plan technique pour la mise en oeuvre du projet est créé, décrivant les plateformes, les technologies et l'architecture initiale (conception) du programme. Cette étape comprend une bonne part de travail créatif, étant effectué par des analystes TI ou des spécialistes logiciels ayant beaucoup d'expérience. On les appelle parfois architectes logiciels. Selon les exigences, les parties suivantes sont choisies :
- Le type d'application : par exemple une application console, une application de bureau (GUI, application d'interface utilisateur graphique), une application client-serveur, une application Web, une application Internet riche (RIA), une application mobile, une application peer-to-peer ou autre ;
- L'architecture du logiciel : par exemple une architecture en Onion, CQRS, monocouche, double couche, triple couche, multicouche, SOA ;
- Le langage de programmation le plus adapté à la mise en oeuvre - par exemple C#, Java, PHP, Python, Ruby, Free Pascal, JavaScript ou C++, ou une combinaison de différents langages ;
- Les technologies étant utilisées : plateforme (Microsoft .NET, Mono, Java EE, LAMP ou autre), serveur de base de données (Oracle, SQL Server, MySQL, NoSQL, base de données ou autre), technologies pour l'interface utilisateur (Flash, JavaServer Faces, Eclipse RCP, ASP.NET, ASP.NET Core, Windows Forms, Silverlight, WPF ou autre), technologies pour l'accès aux données (par exemple Hibernate, JPA ou ADO.NET, Entity Framework, EF Core), technologies de reporting (SQL Server Reporting Services, Jasper Reports ou autre) et bien d'autres combinaisons de technologies étant utilisées pour la mise en oeuvre des différentes parties du système logiciel.
- Les cadres d'applications de développement simplifiant le développement, par exemple ASP.NET MVC (pour .NET), Knockout.js (pour JavaScript), Ruby on Rails (pour Ruby), Django (pour Python) et bien d'autres.
- Le nombre et les compétences des personnes faisant partie de l'équipe de développement (les projets importants et sérieux sont réalisés par des équipes de développeurs nombreuses et expérimentées) ;
- Le plan de développement : séparer les fonctionnalités en étapes, les ressources et les délais pour chaque étape.
- Autres (taille de l'équipe, localisation de l'équipe, méthodes de communication (Microsoft Teams,..),...).
Bien qu'il existe de nombreuses règles facilitant une analyse et une planification correctes, une bonne dose d'intuition et de perspicacité est requise à ce stade. Cette étape prédétermine l'avancement ultérieur du processus de développement. Aucune programmation n'est effectuée à ce stade, seulement une préparation.
Mise en oeuvre
L'étape la plus étroitement liée à la programmation est la mise en oeuvre. À ce stade, le programme (application) est mis en oeuvre (écrit) selon la tâche, la conception et l'architecture données. Les programmeurs participent en écrivant le code du programme (source). Les autres étapes peuvent être soit courtes, soit complètement ignorées lors de la création d'un petit projet, mais la mise en oeuvre est toujours présente ; sinon, le processus n'est pas du développement logiciel.
Tests d'applications
Les tests d'applications constituent une étape très importante du développement logiciel. Leur objectif est de s'assurer que toutes les exigences sont strictement respectées et couvertes. Ce processus peut être mis en oeuvre manuellement, mais la méthode préférée pour le faire est d'utiliser des tests automatisés. Ces tests sont de petits programmes (NUnit, xUnit, MSTest, SpecFlow, FluentAssertions,...) automatisant les essais autant que possible. Certaines parties de la fonctionnalité sont très difficiles à automatiser, c'est pourquoi les essais d'applications incluent des procédures automatisées et manuelles pour garantir la qualité du code. Par exemple, on retrouvera les tests unitaires, les tests d'intégration, les tests de régression, les tests fonctionnels, les tests de performances,...
Le processus de test (essais) est mis en oeuvre par des spécialistes d'assurance qualité (QA). Ils travaillent en étroite collaboration avec les programmeurs pour trouver et corriger les erreurs (bogues) dans le logiciel. À ce stade, il est prioritaire de trouver des défauts dans le code et presque aucun nouveau code n'est écrit.
De nombreux défauts et erreurs sont généralement détectés lors de la phase de test et le programme est renvoyé à la phase d'implantation. Ces deux étapes sont très étroitement liées et il est courant qu'un produit logiciel passe de l'une à l'autre plusieurs fois avant de couvrir toutes les exigences et d'être prêt pour les phases de déploiement et d'utilisation.
Déploiement et exploitation
Le déploiement est le processus permettant de mettre en exploitation un produit logiciel donné. Si le produit est complexe et s'adresse à de nombreuses personnes, ce processus peut être le plus lent et le plus coûteux. Pour les programmes plus petits, c'est un processus relativement rapide et indolore. Dans le cas le plus courant, un programme spécial, appelé installateur, est développé. Il assure l'installation rapide et facile du produit. Si le produit doit être déployé dans une grande entreprise avec des dizaines de milliers d'exemplaires, un logiciel de support supplémentaire est développé spécialement pour le déploiement. Une fois le déploiement terminé avec succès, le produit est prêt à être utilisé. L'étape suivante consiste à former les employés à son utilisation.
Un exemple serait le déploiement d'une nouvelle version de Microsoft Windows dans l'administration publique. Cela comprend l'installation et la configuration du logiciel ainsi que la formation des employés à son utilisation.
Le déploiement est généralement effectué par l'équipe ayant travaillé sur le logiciel ou par des spécialistes du déploiement formés. Il peut s'agir d'administrateurs système, d'administrateurs de base de données (DBA), de spécialistes système, de consultants spécialisés et autres. À ce stade, presque aucun nouveau code n'est écrit, mais le code existant est peaufiné et configuré jusqu'à ce qu'il couvre toutes les exigences spécifiques pour un déploiement réussi.
Support technique
Lors du processus d'exploitation, il est inévitable que des problèmes apparaissent. Ils peuvent être causés par de nombreux facteurs - erreurs dans le logiciel, utilisation incorrecte ou configuration défectueuse - mais la plupart des problèmes surviennent lorsque les utilisateurs modifient leurs exigences. En raison de ces problèmes, le logiciel perd sa capacité à résoudre la tâche commerciale pour laquelle il a été créé. Cela nécessite une implication supplémentaire de la part des développeurs et des experts du support. Le processus de support se poursuit généralement tout au long du cycle de vie du produit logiciel, quelle que soit sa qualité.
Le support est assuré par l'équipe de développement et par des experts du support spécialement formés. En fonction des modifications apportées, de nombreuses personnes différentes peuvent être impliquées dans le processus - analystes commerciaux, architectes, programmeurs, spécialiste QA, administrateurs et autres.
Par exemple, si nous prenons un logiciel de calcul des salaires, il devra être mis à jour à chaque fois que la législation fiscale concernant le processus de comptabilité des services sera modifiée. L'intervention de l'équipe de support sera nécessaire si, par exemple, le matériel de l'utilisateur final est modifié, car le logiciel devra être réinstallé et configuré.
Documentation
L'étape de documentation n'est pas une étape distincte mais accompagne toutes les autres étapes. La documentation est une partie importante du développement logiciel et vise à transmettre les connaissances entre les différents participants au développement et au support d'un produit logiciel. Les informations sont transmises entre les différentes étapes ainsi qu'au sein d'une seule étape. La documentation de développement est généralement créée par les développeurs (architectes, programmeurs, spécialistes QA et autres) et représente une combinaison de documents.
Le développement de logiciels est bien plus que du codage
Comme nous l'avons vu, le développement de logiciels est bien plus que du codage (écriture de code), et il comprend un certain nombre d'autres processus tels que : l'analyse des besoins, la conception, la planification, les tests et le support, nécessitant une grande variété de spécialistes appelés ingénieurs logiciels. La programmation n'est qu'une petite partie, mais très essentielle, du développement de logiciels.
Notre premier programme C#
Avant de poursuivre avec une description détaillée du langage de programmation C# et de la plateforme .NET, examinons un exemple simple, illustrant à quoi ressemble un programme écrit en C# :
La seule chose que fait ce programme est d'afficher le message "Bonjour C# !" sur la sortie par défaut. Il est encore trop tôt pour l'exécuter, c'est pourquoi nous ne nous intéresserons qu'à sa structure.
Comment fonctionne notre premier programme C# ?
Notre premier programme se compose de trois parties logiques :
- Définition d'une classe BonjourCSharp;
- Définition d'une méthode Main();
- Contenu de la méthode Main().
Définition d'une classe
Sur la première ligne de notre programme, nous définissons une classe appelée BonjourCSharp. La définition la plus simple d'une classe consiste en le mot-clef class, suivi de son nom. Dans notre cas, le nom de la classe est BonjourCSharp. Le contenu de la classe se trouve dans un bloc de lignes de programme, entouré d'accolades : {}
Définition de la méthode Main()
Sur la troisième ligne, nous définissons une méthode avec le nom Main(), qui est le point de départ de notre programme. Tout programme écrit en C# démarre à partir d'une méthode Main() avec le titre (signature) suivant :
La méthode doit être déclarée comme indiqué ci-dessus, elle doit être statique et vide, elle doit avoir un nom Main et comme liste de paramètres elle ne doit avoir qu'un seul paramètre de type tableau de chaîne de caractères. Dans notre exemple, le paramètre s'appelle args mais ce n'est pas obligatoire. Ce paramètre n'est pas utilisé dans la plupart des cas, il peut donc être omis (il est facultatif). Dans ce cas, le point d'entrée du programme peut être simplifié et ressemblera à ceci :
Si l'une des conditions ci-dessus n'est pas remplie, le programme sera compilé mais ne démarrera pas car le point de départ n'est pas défini correctement.
Contenu de la méthode Main()
Le contenu de chaque méthode se trouve après sa signature, entouré d'accolades ouvrantes et fermantes. Sur la ligne suivante de notre exemple de programme, nous utilisons l'objet système System.Console et sa méthode WriteLine() pour afficher un message sur la sortie par défaut (la console), dans ce cas "Bonjour C# !". Dans la méthode Main(), nous pouvons écrire une séquence aléatoire d'expressions et elles seront exécutées dans l'ordre que nous leur avons attribué.
C# fait la distinction entre les majuscules et les minuscules !
Le langage de programmation C# fait la distinction entre les majuscules et les minuscules, nous devons donc utiliser la casse appropriée lorsque nous écrivons du code C#. Dans l'exemple ci-dessus, nous avons utilisé des mots-clefs tels que class, static, void et les noms de certaines classes et objets système, tels que System.Console.
Soyez prudent lorsque vous écrivez ! La même chose, écrite en majuscules, en minuscules ou dans un mélange des deux, signifie des choses différentes en C#. L'écriture de Class est différente de class et System.Console est différente de SYSTEM.CONSOLE.
Cette règle s'applique à tous les éléments de votre programme : mots-clefs, noms de variables, noms de classes,...
Le code du programme doit être correctement formaté
Le formatage consiste à ajouter des caractères tels que des espaces, des tabulations et des nouvelles lignes, étant insignifiants pour le compilateur et donnant au code une structure logique et le rendent plus facile à lire. Prenons par exemple notre premier programme (la version courte de la méthode Main()) :
Le programme contient sept lignes de code et certaines d'entre elles sont plus indentées que d'autres. Tout cela peut également être écrit sans tabulations, comme ceci :
Ou sur la même ligne :
Ou même comme ça :
Les exemples ci-dessus seront compilés et exécutés exactement comme le code formaté, mais ils sont plus difficiles à lire et à comprendre, et donc difficiles à modifier et à maintenir.
Règles de formatage principales
Si nous voulons que notre code soit correctement formaté, nous devons suivre plusieurs règles importantes concernant l'indentation :
- Les méthodes sont indentées à l'intérieur de la définition de la classe (déplacement vers la droite d'un ou plusieurs caractères Tab) ;
- Le contenu des méthodes est indenté à l'intérieur de la définition de la méthode ;
- L'accolade ouvrante { doit être sur sa propre ligne et placée exactement sous la méthode ou la classe à laquelle elle fait référence ;
- L'accolade fermante } doit être sur sa propre ligne, placée exactement verticalement sous l'accolade ouvrante respective (avec la même indentation) ;
- Tous les noms de classe doivent commencer par une majuscule ;
- Les noms de variables doivent commencer par une minuscule ;
- Les noms de méthodes doivent commencer par une majuscule ;
L'indentation du code suit une règle très simple : lorsqu'un morceau de code est logiquement à l'intérieur d'un autre morceau de code, il est indenté (déplacé) vers la droite avec un simple Tab. Par exemple, si une méthode est définie à l'intérieur d'une classe, elle est indentée (déplacée vers la droite). De la même manière, si le corps d'une méthode est à l'intérieur d'une méthode, il est indenté. Pour simplifier, nous pouvons supposer que lorsque nous avons le caractère «{», tout le code le suivant jusqu'à sa fermeture «}» doit être indenté vers la droite.
Les noms de fichiers correspondent aux noms de classe
Chaque programme C# se compose d'une ou plusieurs définitions de classe. Il est admis que chaque classe est définie dans un fichier séparé avec un nom correspondant au nom de la classe et une extension .cs. Lorsque ces exigences ne sont pas remplies, le programme fonctionnera toujours, mais la navigation dans le code sera difficile. Dans notre exemple, la classe s'appelle BonjourCSharp, et par conséquent nous devons enregistrer son code source dans un fichier appelé BonjourCSharp.cs.
Le langage C# et la plateforme .NET
La première version de C# a été développée par Microsoft entre 1999 et 2002 et a été officiellement publiée au public en 2002 dans le cadre de la plateforme .NET. La plateforme .NET vise à faciliter le développement de logiciels pour Windows en proposant une nouvelle approche de la programmation de qualité, basée sur les concepts de «machine virtuelle» et de «code géré». À cette époque, le langage de programmation et la plateforme Java ont rencontré un énorme succès dans tous les domaines du développement de logiciels ; C# et .NET étaient la réponse naturelle de Microsoft à la technologie Java.
Le langage C#
Le C# est un langage de programmation moderne, polyvalent, orienté objet et de haut niveau. Sa syntaxe est similaire à celle de C et C++, mais de nombreuses fonctionnalités de ces langages ne sont pas prises en charge en C# afin de simplifier le langage, ce qui facilite la programmation.
Les programmes C# se composent d'un ou plusieurs fichiers avec une extension .cs, contenant des définitions de classes et d'autres types. Ces fichiers sont compilés par le compilateur C# (csc) en code exécutable et, par conséquent, des assemblages sont créés, étant des fichiers portant le même nom mais avec une extension différente (.exe ou .dll). Par exemple, si on compile BonjourSharp.cs, on obtiendra un fichier portant le nom BonjourCSharp.exe (d'autres fichiers seront également créés, mais nous n'en parlerons pas pour le moment).
Nous pouvons exécuter le code compilé comme n'importe quel autre programme sur notre ordinateur (en double-cliquant dessus). Si nous essayons d'exécuter le code C# compilé (par exemple BonjourCSharp.exe) sur un ordinateur ne disposant pas du .NET Framework ou .NET Core, nous recevrons un message d'erreur.
Les mots clefs
Le C# utilise les mots clefs suivants pour créer ses constructions de programmation (la liste augmente continuellement à chaque, elle n'est donc pas complète) :
- abstract
- as
- base
- bool
- break
- byte
- case
- catch
- char
- checked
- class
- const
- continue
- decimal
- default
- delegate
- do
- double
- else
- enum
- event
- explicit
- extern
- false
- finally
- fixed
- float
- for
- foreach
- goto
- if
- implicit
- in
- int
- interface
- internal
- is
- lock
- long
- namespace
- new
- null
- object
- operator
- out
- override
- params
- private
- protected
- public
- readonly
- ref
- return
- sbyte
- sealed
- short
- sizeof
- stackalloc
- static
- string
- struct
- switch
- this
- throw
- true
- try
- typeof
- uint
- ulong
- unchecked
- unsafe
- ushort
- using
- virtual
- void
- volatile
- while
Depuis la création de la première version du langage de programmation C#, tous les mots clefs ne sont pas utilisés. Certains d'entre eux ont été ajoutés dans les versions ultérieures. Les principaux éléments de programme en C# (étant définis et utilisés à l'aide de mots clefs) sont les classes, les méthodes, les opérateurs, les expressions, les instructions conditionnelles, les boucles, les types de données, les exceptions et quelques autres.
Gestion automatique de la mémoire
L'un des plus grands avantages de .NET Framework ou .NET Core est la gestion automatique de la mémoire intégrée. Elle protège les programmeurs de la tâche complexe consistant à allouer manuellement de la mémoire aux objets, puis à attendre le moment opportun pour la libérer. Cela augmente considérablement la productivité des développeurs et la qualité des programmes écrits en C#.
Dans .NET Framework ou .NET Core, il existe un composant spécial du CLR s'occupant de la gestion de la mémoire. Il s'agit d'un «Ramasse-miettes» (système de nettoyage automatique de la mémoire). Le ramasse-miettes a les tâches principales suivantes : vérifier quand la mémoire allouée aux variables n'est plus utilisée, la libérer et la rendre disponible pour l'allocation de nouveaux objets.
Il est important de noter qu'il n'est pas exactement clair à quel moment la mémoire est nettoyée des objets inutilisés (variables locales par exemple). Selon les spécifications du langage de programmation C#, cela se produit à un moment donné après qu'une variable donnée soit sortie de portée, mais il n'est pas précisé si cela se produit instantanément, après un certain temps ou lorsque la mémoire disponible devient insuffisante pour le fonctionnement normal du programme.
Il est important de noter qu'il n'est pas clairement établi à quel moment la mémoire est nettoyée des objets inutilisés (variables locales par exemple). Selon les spécifications du langage de programmation C#, cela se produit à un moment donné après qu'une variable donnée soit sortie de la portée, mais il n'est pas précisé si cela se produit instantanément, après un certain temps ou lorsque la mémoire disponible devient insuffisante pour le fonctionnement normal du programme.
Indépendance vis-à-vis de l'environnement et du langage de programmation
L'un des avantages de .NET est que les programmeurs utilisant différents langages .NET peuvent facilement échanger leur code. Par exemple, un programmeur C# peut utiliser le code écrit par un autre programmeur en VB.NET, Managed C++ ou F#. Cela est possible car les programmes écrits dans différents langages .NET partagent un système commun de types de données, une infrastructure d'exécution et un format unifié du code compilé (assemblys).
Un grand avantage de la technologie .NET est la possibilité d'exécuter du code, qui est écrit et compilé une seule fois, sur différents systèmes d'exploitation et périphériques matériels. Nous pouvons compiler un programme C# dans un environnement Windows, puis l'exécuter sous Windows, Windows Mobile, Windows RT ou Linux. Officiellement, Microsoft ne prend en charge le .NET Framework que sur Windows, Windows Mobile et Windows Phone, mais il existe des fournisseurs tiers proposant une implémentation .NET sur d'autres systèmes d'exploitation. Suite à cela, à partir de 2016, Microsoft fini par proposé la version .NET Core laquelle prend en charge n'importe quel plateforme Windows, Linux ou macOS.
Mono (.NET pour Linux)
Un exemple d'implémentation .NET pour un environnement non Windows est le projet open source Mono. Il implémente le .NET Framework et la plupart des bibliothèques l'accompagnant pour Linux, FreeBSD, iPhone et Android. Mono est une implémentation .NET non officielle et certaines fonctionnalités peuvent ne pas fonctionner exactement comme prévu. Il implémente bien les normes .NET de base (comme le compilateur C# et CLR) mais ne prend pas entièrement en charge les dernières technologies et cadres d'applications .NET comme WPF et ASP.NET MVC.
Microsoft Intermediate Language (MSIL)
L'idée d'indépendance vis-à-vis de l'environnement a été posée dès les premières étapes de la création de la plateforme .NET et est mise en ouvre à l'aide d'une petite astuce. Le code de sortie n'est pas compilé en instructions pour un microprocesseur spécifique et n'utilise pas les fonctionnalités d'un système d'exploitation spécifique ; il est compilé dans ce que l'on appelle le langage MSIL (Microsoft Intermediate Language). Ce MSIL n'est pas exécuté directement par le microprocesseur mais à partir d'un environnement virtuel appelé Common Language Runtime (CLR).
Common Language Runtime (CLR) - le coeur de .NET
Au coeur même de la plateforme .NET bat son coeur - le Common Language Runtime (CLR) - l'environnement contrôlant l'exécution du code managé (code MSIL). Il assure l'exécution des programmes .NET sur différentes plateformes matérielles et systèmes d'exploitation.
Le CLR est une machine de calcul abstraite (machine virtuelle). Comme les ordinateurs physiques, elle prend en charge un ensemble d'instructions, de registres, d'accès à la mémoire et d'opérations d'entrée-sortie. Le CLR assure une exécution contrôlée des programmes .NET en utilisant toutes les capacités du processeur et du système d'exploitation. CLR effectue également l'accès managé à la mémoire et aux autres ressources de l'ordinateur, tout en respectant les règles d'accès définies lors de l'exécution du programme.
La plateforme .NET
La plateforme .NET contient le langage de programmation C#, CLR et de nombreux instruments et bibliothèques auxiliaires prêts à l'emploi. Il existe quelques versions de .NET en fonction du groupe d'utilisateurs ciblé :
- .NET Framework est la version la plus courante de l'environnement .NET en raison de son objectif général. Il est utilisé dans le développement d'applications de console, d'applications Windows avec une interface utilisateur graphique, d'applications Web et bien d'autres.
- .NET Core est la version multi-plateforme de .NET, c'est-à-dire fonctionnant sous Windows, Linux et macOS.
- .NET Compact Framework (CF) est une version «légère» du .NET Framework standard et est utilisé dans le développement d'applications pour téléphones mobiles et autres appareils PDA utilisant Windows Mobile Edition.
- Silverlight est également une version «légère» du .NET Framework, destinée à être exécutée sur des navigateurs Web afin de mettre en oeuvre des applications multimédia et Internet riches.
- .NET pour les applications Windows Store est un sous-ensemble de .NET Framework conçu pour le développement et l'exécution d'applications .NET dans l'environnement Windows 8 et Windows RT (les soi-disant applications Windows Store)
.NET Framework
La version standard de la plateforme .NET est destinée au développement et à l'utilisation d'applications de console, d'applications de bureau, d'applications Web, de services Web, d'applications Internet riches, d'applications mobiles pour tablettes et de téléphones intelligent et bien d'autres encore. Presque tous les développeurs .NET utilisent la version standard.
.NET Core
.NET Core est le nouveau .NET utilisé par toutes les nouvelles technologies. Ce cadre d'application est open source et vous pouvez le trouver sur http://www.github.com/dotnet. Le runtime est le dépôt CoreCLR ; le cadre d'application contenant les classes de collection, l'accès au système de fichiers, la console, XML et bien plus encore se trouve dans le référentiel CoreFX.
Contrairement au .NET Framework, où la version spécifique dont vous aviez besoin pour l'application devait être installée sur le système, avec .NET Core 1.0, le cadre d'application, y compris le runtime, est fourni avec l'application. Auparavant, il y avait des moments où vous pouviez avoir des problèmes pour déployer une application Web ASP.NET sur un serveur partagé parce que le fournisseur avait installé d'anciennes versions de .NET ; ces moments sont révolus. Vous pouvez désormais fournir le runtime avec l'application et vous ne dépendez pas de la version installée sur le serveur.
.NET Core est conçu selon une approche modulaire. Le cadre d'application est divisé en une grande liste de paquet NuGet. Pour que vous n'ayez pas à gérer tous les paquets, les métapaquets référencent les paquets plus petits fonctionnant ensemble. Cela s'est encore amélioré avec .NET Core 2.0 et ASP.NET Core 2.0. Avec ASP.NET Core 2.0, il vous suffit de référencer Microsoft.AspNetCore.All pour obtenir tous les paquets dont vous avez généralement besoin avec les applications Web ASP.NET Core.
Le .NET Core peut être mis à jour à un rythme rapide. Même la mise à jour du runtime n'influence pas les applications existantes, car le runtime peut être installé avec les applications. Microsoft peut désormais améliorer .NET Core, y compris le runtime, avec des cycles de publication plus rapides.
Pour développer des applications à l'aide de .NET Core, Microsoft a créé de nouveaux utilitaires de ligne de commande.
.NET
À partir de .NET 5, .NET Core porte un nouveau nom : .NET. La suppression de «Core» dans le nom devrait indiquer aux développeurs utilisant encore .NET Framework qu'il n'existe plus de nouvelle version de .NET Framework à partir de maintenant. .NET Framework ne bénéficie plus de nouvelles fonctionnalités. Pour les nouvelles applications, vous devez utiliser .NET.
.NET Standard
.NET Standard est une spécification importante lors de la création et de l'utilisation de bibliothèques. .NET Standard propose un contrat plutôt qu'une implémentation. Avec ce contrat, les API disponibles sont répertoriées. Avec chaque nouvelle version de .NET Standard, de nouvelles API sont ajoutées. Les API ne sont jamais supprimées. Par exemple, .NET Standard 2.1 répertorie plus d'API que .NET Standard 1.6.
Lorsque vous créez une bibliothèque, vous souhaitez probablement utiliser autant d'API que possible, je vous suggère donc de choisir la version .NET Standard la plus récente. Cependant, la version standard la plus élevée signifie également le plus petit nombre de plates-formes prenant en charge cette norme, vous devrez donc peut-être en tenir compte.
À partir de .NET 5, .NET Standard devient obsolète. Si vous créez des bibliothèques avec .NET 5, vous pouvez utiliser des bibliothèques d'applications .NET 5, .NET 6 et versions ultérieures. De même, lorsque vous créez des bibliothèques avec .NET 7, vous pouvez utiliser des bibliothèques d'applications écrites avec .NET 7 et versions ultérieures.
Technologies .NET
Bien que la plateforme .NET soit vaste et complète, elle ne fournit pas tous les outils nécessaires pour résoudre tous les problèmes de développement logiciel. De nombreux développeurs de logiciels indépendants développent et ajoutent des fonctionnalités standard offertes par le .NET Framework ou le .NET Core. Par exemple, des sociétés comme la société bulgare de logiciels Telerik (Telerik UI,...) développent des ensembles de composantes subsidiaires. Ces composantes sont utilisés pour créer des interfaces utilisateur graphiques, des systèmes de gestion de contenu Web, pour préparer des rapports et ils facilitent le développement d'applications.
Les extensions .NET Framework sont des composantes logiciels pouvant être réutilisés lors du développement de programmes .NET. La réutilisation du code facilite et simplifie considérablement le développement logiciel, car elle fournit des solutions aux problèmes courants, propose des implémentations d'algorithmes complexes et de normes technologiques. Le programmeur contemporain utilise des bibliothèques et des composants tous les jours et économise ainsi beaucoup d'efforts.
Prenons l'exemple suivant : un logiciel visualisant des données sous forme de graphiques et de diagrammes. Nous pouvons utiliser une bibliothèque écrite en .NET dessinant les graphiques. Il suffit de saisir les données correctes et la bibliothèque dessinera les graphiques pour nous. C'est très pratique et efficace. Cela permet également de réduire les coûts de production, car les programmeurs n'auront pas besoin de passer du temps à travailler sur des fonctionnalités supplémentaires (dans notre cas, dessiner les graphiques, ce qui implique des calculs mathématiques complexes et contrôler la carte graphique). L'application elle-même sera de meilleure qualité car l'extension qu'elle utilise est développée et supportée par des spécialistes ayant plus d'expérience dans ce domaine spécifique.
Les technologies logicielles sont des ensembles de classes, de modules, de bibliothèques, de modèles de programmation, d'outils, de modèles et de bonnes pratiques abordant un problème spécifique dans le développement de logiciels. Il existe des technologies logicielles générales, telles que les technologies Web, les technologies mobiles, les technologies d'infographie et les technologies liées à certaines plateformes telles que .NET ou Java.
Il existe de nombreuses technologies .NET destinées à différents domaines du développement .NET. Les exemples typiques sont les technologies Web (comme ASP.NET et ASP.NET MVC), permettant la création rapide et facile d'applications Web dynamiques et les technologies mobiles .NET (comme WinJS), permettant la création d'applications multimédias riches en interface utilisateur fonctionnant sur Internet.
.NET Framework inclut par défaut de nombreuses technologies et bibliothèques de classes avec des fonctionnalités standard que les développeurs peuvent utiliser. Par exemple, il existe des classes prêtes à l'emploi dans la bibliothèque système fonctionnant avec des fonctions mathématiques, calculant des logarithmes et des fonctions trigonométriques (classe System.Math). Un autre exemple est la bibliothèque traitant des réseaux (System.Net), possédant une fonctionnalité intégrée pour envoyer des courriels (en utilisant la classe System.Net.Mail.MailMessage) et pour télécharger des fichiers depuis Internet (en utilisant System.Net.WebClient).
Une technologie .NET est un ensemble de classes, bibliothèques, outils, normes et autres moyens de programmation .NET et de modèles de développement établis, déterminant le cadre technologique pour la création d'un certain type d'application. Une bibliothèque .NET est un ensemble de classes .NET, offrant certaines fonctionnalités prêtes à l'emploi. Par exemple, ADO.NET est une technologie offrant une approche standardisée pour accéder aux bases de données relationnelles (comme SQL Server et MySQL). Les classes du paquet (espace de noms) System.Data.SqlClient sont un exemple de bibliothèque .NET, fournissant des fonctionnalités pour se connecter à un serveur SQL via la technologie ADO.NET.
Certaines des technologies développées par des développeurs de logiciels extérieurs à Microsoft se sont largement répandues et se sont ainsi imposées comme des normes technologiques. Certaines d'entre elles sont remarquées par Microsoft et sont ensuite ajoutées à la prochaine itération du .NET Framework. Ainsi, la plateforme .NET évolue et s'enrichit constamment de nouvelles bibliothèques et technologies. Par exemple, les technologies de cartographie objet-relationnel ont été initialement développées en tant que projets et produits indépendants (comme le projet open source NHibernate et l'ORM OpenAccess de Telerik). Après avoir acquis une énorme popularité, leur inclusion dans le .NET Framework est devenue une nécessité. C'est ainsi que les technologies LINQ-to-SQL et ADO.NET Entity Framework sont nées, respectivement dans .NET 3.5 et .NET 4.0.
Interface de programmation d'application (API)
Chaque bibliothèque ou technologie .NET est utilisée pour créer des objets et appeler leurs méthodes. L'ensemble des classes et méthodes publiques dans les bibliothèques de programmation est appelé interface de programmation d'application ou simplement API. À titre d'exemple, nous pouvons examiner l'API .NET elle-même ; il s'agit d'un ensemble de bibliothèques de classes .NET, étendant les capacités du langage et ajoutent des fonctionnalités de haut niveau. Toutes les technologies .NET offrent une API publique. Les technologies sont souvent appelées simplement API, ce qui ajoute certaines fonctionnalités. Par exemple : API pour travailler avec des fichiers, API pour travailler avec des graphiques, API pour travailler avec des imprimantes, API pour lire et créer des documents Word et Excel, API pour créer des documents PDF, API de développement Web,...
Documentation .NET
Il est souvent nécessaire de documenter une API, car elle contient de nombreux espaces de noms et classes. Les classes contiennent des méthodes et des paramètres. Leur fonction n'est pas toujours évidente et doit être expliquée. Il existe également des dépendances internes entre les différentes classes, qui doivent être expliquées pour être utilisées correctement. Ces explications et instructions techniques sur la façon d'utiliser une technologie, une bibliothèque ou une API donnée sont appelées documentation. La documentation se compose d'un ensemble de documents à contenu technique.
Le .NET Framework et le .NET Core dispose également d'une documentation officiellement développée et prise en charge par Microsoft. Elle est disponible publiquement sur Internet et est également distribuée avec la plateforme .NET sous forme d'un ensemble de documents et d'outils de navigation et de recherche.
La bibliothèque MSDN est la documentation officielle de Microsoft pour tous ses produits destinés aux développeurs et aux technologies logicielles. La documentation technique de .NET fait partie de la bibliothèque MSDN.