Skip to content

1. Introduction

Le PDF du document est ICI.

Les codes du document sont ICI.

Ce document est un produit de l'IA Claude d'Anthropic. C'est la réécriture, pour le langage C# 14 et la plateforme .NET 10, du cours Apprentissage du langage C# version 3.0 avec le framework .NET 3.5 écrit par Serge Tahé en mai 2008. Il en reprend le plan, les exemples et le fil rouge, et en actualise le langage, les bibliothèques et les outils :

  • le cours de 2008 utilisait C# 3.0 et le framework .NET 3.5, sous Windows, avec Visual C# 2008 Express. Depuis, C# a connu onze versions majeures (de C# 4.0 en 2010 à C# 14 en 2025) et la plateforme .NET a été entièrement réécrite : elle est devenue libre, multiplateforme (Windows, Linux, macOS) et publiée chaque année. Ce document utilise .NET 10 (novembre 2025, version à support long) et C# 14 ;
  • le chapitre sur les interfaces graphiques Windows Forms a été supprimé : les applications de gestion s'écrivent aujourd'hui le plus souvent avec des interfaces web. Le chapitre « Evénements utilisateur », qui le suivait, est devenu un chapitre sur les délégués, les expressions lambda et les événements, sans formulaires ;
  • deux chapitres sont nouveaux : la programmation asynchrone (les tâches [Task] et les mots clés [async] / [await], apparus en 2012 avec C# 5) et Entity Framework Core, l'outil de correspondance objet / relationnel de .NET. Le chapitre sur les classes .NET d'usage courant présente désormais LINQ (le cours de 2008 indiquait explicitement qu'il ne l'abordait pas) ;
  • les outils ont changé : l'éditeur [VS Code] (ou l'IDE [Visual Studio 2026]) et la commande [dotnet] remplacent Visual C# 2008 Express ; le framework de tests [MSTest] remplace [NUnit 2] ; l'injection de dépendances de [Microsoft.Extensions.DependencyInjection] remplace [Spring.NET] ; le SGBD [MySQL] (fourni par [Laragon]) et le connecteur [MySqlConnector] remplacent SQL Server 2005 Express ; la classe [HttpClient] remplace [WebClient] et [WebRequest], devenues obsolètes ; les services web REST / JSON écrits avec ASP.NET Core remplacent les services web SOAP [ASMX] ;
  • tout ce qui est devenu obsolète a été retiré ou signalé comme tel, et chaque chapitre présente, au moment où elles servent, les nouveautés du langage et de la plateforme.

Ce document n'est pas un cours exhaustif. Comme celui de 2008, il est destiné à des personnes connaissant déjà la programmation et qui veulent découvrir les bases de C#. Il procède par l'exemple : plus de deux cents programmes (près de trois cents fichiers C#), courts pour la plupart, commentés ligne par ligne.

1.1. C# et .NET de 2002 à 2026

C# a été rendu public en février 2002, en même temps que la plateforme .NET 1.0 de Microsoft à laquelle il est lié. La plateforme .NET est un environnement d'exécution analogue à la machine virtuelle Java : les compilateurs des langages .NET (C#, F#, VB.NET) produisent un code intermédiaire (IL, « Intermediate Language ») que la machine virtuelle .NET (le CLR, « Common Language Runtime ») compile à la volée en code machine. Toutes les classes de la plateforme sont disponibles pour tous les langages .NET.

En 2008, le cours écrivait que .NET ne s'exécutait que sous Windows et que le projet Mono permettait de l'utiliser, partiellement, sous Unix et Linux. La situation a profondément changé :

  • 2016 : .NET Core 1.0. Microsoft publie une nouvelle implémentation de .NET, libre (licence MIT, code sur GitHub) et multiplateforme : Windows, Linux et macOS. L'ancien « framework .NET » (.NET Framework 4.x) reste maintenu pour les anciennes applications Windows mais n'évolue plus ;
  • 2020 : .NET 5. .NET Core devient simplement « .NET » : une seule plateforme pour tous les usages (console, web, bureau, mobile, nuage) ;
  • depuis 2020 : une nouvelle version de .NET paraît chaque année en novembre. Les versions paires (.NET 6, 8, 10) sont à support long (LTS, trois ans) ; les versions impaires (.NET 7, 9) sont à support standard (STS : dix-huit mois, portés à deux ans à partir de .NET 9). Chaque version de .NET apporte une nouvelle version de C# ;
  • novembre 2025 : .NET 10 (LTS) et C# 14, utilisés dans ce document. .NET 10 est supporté jusqu'en novembre 2028.

Le cours de 2008 écrivait aussi qu'en 2002, C# était largement une copie de Java et qu'on passait aisément de l'un à l'autre, mais que les deux langages avaient depuis pris chacun leurs spécificités. L'écart s'est creusé : C# a intégré au fil des versions des idées venues des langages fonctionnels (expressions lambda, LINQ, filtrage par motif, records, types immuables), l'asynchronisme ([async] / [await], que JavaScript, Python ou Rust ont ensuite repris), et un système de types qui détecte à la compilation les références nulles.

Le tableau suivant résume les principales nouveautés du langage depuis C# 3.0 et indique le chapitre de ce document où elles sont présentées :

Version
Année
Principales nouveautés
Chapitre
C# 4.0
2010
paramètres nommés et optionnels (le type [dynamic] et la variance des génériques, apparus aussi avec C# 4, ne sont pas présentés)
3
C# 5
2012
méthodes asynchrones [async] / [await]
9
C# 6
2015
chaînes interpolées [$"..."], [nameof], opérateur [?.], filtres d'exception [when], membres à corps d'expression
3, 4
C# 7.0 - 7.3
2017-2018
tuples et déconstruction, [out var], fonctions locales, filtrage par motif, littéraux binaires et séparateur [_], paramètres [in]
3, 4
C# 8
2019
types référence nullables, expressions [switch], index [^1] et plages [1..3], [??=], déclarations [using], méthodes d'interface par défaut, flux asynchrones [await foreach]
3 à 9
C# 9
2020
instructions de haut niveau, [record], propriétés [init], [new()] à type cible, motifs relationnels et logiques
3, 4
C# 10
2021
[global using], espaces de noms de portée fichier, [record struct], type naturel des lambdas
3, 4, 7
C# 11
2022
chaînes brutes ["""], membres [required], motifs de liste, membres statiques abstraits d'interface
3, 4, 5, 12
C# 12
2023
constructeurs primaires, expressions de collection [1, 2, 3], alias de tout type, paramètres lambda par défaut
3 à 7
C# 13
2024
collections [params], type [System.Threading.Lock]
3, 8
C# 14
2025
membres d'extension (blocs [extension]), mot clé [field], affectation conditionnelle [a?.B = x], opérateurs d'affectation composée définis par l'utilisateur, modificateurs des paramètres lambda sans type
4, 7

Du côté de la plateforme, les nouveautés présentées sont notamment : la commande [dotnet] et les applications fichier unique (.NET 10), le format de solution [.slnx], LINQ, les collections génériques modernes, [System.Text.Json], les expressions régulières générées à la compilation, l'injection de dépendances, les tâches et la bibliothèque parallèle, les canaux [Channel<T>], [HttpClient], ASP.NET Core et Entity Framework Core.

1.2. Le contenu du document

Le document comprend les chapitres suivants :

  • chapitre 2 : l'installation de l'environnement de travail (SDK .NET 10, VS Code ou Visual Studio, la commande [dotnet]) ;
  • chapitre 3 : les bases du langage (types, opérateurs, instructions de contrôle, exceptions, énumérations, passage de paramètres, tuples) ;
  • chapitre 4 : les classes, les structures, les interfaces, l'héritage, les génériques, les records, les membres d'extension ;
  • chapitre 5 : les classes .NET d'usage courant : chaînes, tableaux, collections, LINQ, fichiers texte et binaires, JSON, expressions régulières ;
  • chapitre 6 : les architectures en couches, les tests unitaires avec MSTest et l'injection de dépendances ;
  • chapitre 7 : les délégués, les expressions lambda et les événements ;
  • chapitre 8 : les threads d'exécution et la synchronisation ;
  • chapitre 9 : la programmation asynchrone ;
  • chapitre 10 : l'accès aux bases de données avec ADO.NET ;
  • chapitre 11 : Entity Framework Core ;
  • chapitre 12 : la programmation Internet (TCP/IP, clients et serveurs TCP, HTTP avec [HttpClient]) ;
  • chapitre 13 : les services web avec ASP.NET Core ;
  • chapitre 14 : pour aller plus loin ;
  • annexes : l'installation de Laragon et de MySQL.

1.3. Le fil rouge : le calcul de l'impôt

Comme en 2008, un même problème est repris tout au long du document : le calcul de l'impôt sur le revenu d'un contribuable n'ayant que son salaire à déclarer. Le barème utilisé est celui du cours d'origine (revenus 2003) : il n'est plus d'actualité, mais il suffit à notre propos, qui est d'écrire la même application de plusieurs façons. Elle est construite en neuf versions :

Version
Chapitre
Contenu
1
3
un programme unique : saisies validées, calcul, affichage
2
4
des classes et des interfaces : [TrancheImpot], [IImpot], [AbstractImpot], [HardwiredImpot]
3
5
les données du calcul lues dans un fichier texte ou un fichier JSON
4
6
une architecture en couches [dao], [metier], [ui] dans un seul projet
5
6
une bibliothèque par couche, des tests unitaires et l'intégration des couches par injection de dépendances
6
10
une couche [dao] qui lit les données dans une base MySQL avec ADO.NET
7
11
une couche [dao] écrite avec Entity Framework Core
8
12
un serveur TCP de calcul de l'impôt et son client
9
13
un service web REST de calcul de l'impôt, un client console et un client web

À partir de la version 5, les versions suivantes réutilisent les couches de la version 5 et ne remplacent que la couche qui change : c'est tout l'intérêt de l'architecture en couches présentée au chapitre 6.

1.4. Les exemples

Les codes du document sont rangés dans un unique dossier [csharp-oct-2026], avec un sous-dossier par chapitre :

csharp-oct-2026/
├── 02-installation/       premiers programmes, solution
├── 03-bases/              bases-01.cs à bases-28.cs, impots-v1.cs
├── 04-classes/            classes-01.cs à classes-25.cs, projets, ImpotsV2
├── 05-classes-dotnet/     chaînes, collections, LINQ, fichiers, regex, ImpotsV3
├── 06-architectures/      ImpotsV4, ImpotsV5 (couches, tests, injection de dépendances)
├── 07-delegues/           delegues-01.cs à delegues-10.cs
├── 08-threads/            threads-01.cs à threads-24.cs
├── 09-async/              async-01.cs à async-23.cs
├── 10-adonet/             adonet-01.cs à adonet-09.cs, scripts SQL, ImpotsV6
├── 11-efcore/             projets EF Core, ImpotsV7
├── 12-internet/           internet-01.cs à internet-19.cs, ImpotsV8
└── 13-services-web/       services web ASP.NET Core et leurs clients (WsImpot, ClientWsImpot : version 9)

Les petits programmes sont des applications fichier unique : un simple fichier [.cs], exécuté par la commande [dotnet run fichier.cs] (chapitre 2). Les programmes de plusieurs fichiers sont des projets ([.csproj]) regroupés dans une solution ([.slnx]) par chapitre.

Tous les programmes du document ont été compilés sans erreur ni avertissement avec le SDK .NET 10, et exécutés. Les résultats reproduits dans le document sont ceux de ces exécutions. Ils ont été obtenus en culture française (fr-FR), comme sur un poste Windows français : les nombres réels s'affichent avec une virgule décimale et les dates en français. Deux remarques :

  • les messages d'erreur de la plateforme .NET (les messages des exceptions) sont en anglais : .NET ne fournit pas de traduction française de ces messages ;
  • les exemples ont été exécutés sous Linux. Pour l'essentiel, cela ne change rien : .NET est multiplateforme. Les quelques différences (chemins de fichiers avec des / au lieu de \, fins de ligne) sont signalées là où elles apparaissent.

Les résultats des programmes multithreads, asynchrones ou réseau, ainsi que les durées mesurées, peuvent varier d'une exécution à l'autre : les commentaires portent sur ce qui est reproductible.

1.5. Les sources

Le cours de 2008 citait les ouvrages qui avaient aidé à l'écrire : « Professional C# programming » (Wrox), « C# et .NET » de Gérard Leblanc (Eyrolles) et « C# 3.0 in a Nutshell » de Joseph et Ben Albahari (O'Reilly), « l'un des meilleurs livres de programmation qu'il m'ait été donné de lire ». Pour la version de 2026, les sources principales sont :