Aller au contenu
learn

C# pour débutants — Mission

Les autres cours de langages de ce site supposent que tu écris déjà du C# ou du Java. Celui-ci, non. Il s’adresse à quelqu’un qui n’a jamais programmé, ou qui a écrit un peu de Python, de JavaScript ou des formules de tableur, et qui veut apprendre C# correctement.

C# est un bon premier langage : le compilateur vérifie ton programme avant qu’il ne s’exécute et explique ce qui ne va pas, les outils sont gratuits sous Windows, Linux et macOS, et le même langage sert à écrire des outils en ligne de commande, des sites web, des jeux et des applications de bureau. Le cours utilise les versions actuelles : C# 14 et .NET 10, sortis en novembre 2025.

Chaque leçon présente quelques notions, et pour chacune :

  1. l’idée, en mots simples ;
  2. un court programme qui l’utilise, avec la sortie qu’il a vraiment affichée ;
  3. les erreurs que font les débutants avec elle, avec le message exact du compilateur ;
  4. des exercices, avec une solution cachée sous Solution : essaie d’abord, puis ouvre-la.

Les exemples utilisent de petites données réelles quand ça aide : les notes d’une guitare, l’accordage qu’utilise Guitar Alchemist, les noms de ses projets. Pas besoin de jouer de la musique pour les suivre.

  • installer le SDK .NET, exécuter un fichier C# et créer un projet, sous Windows, Linux ou macOS ;
  • lire une erreur du compilateur et la corriger ;
  • ranger des valeurs dans des variables du bon type, convertir d’un type à l’autre, et lire ce qui est tapé au clavier ;
  • prendre des décisions avec if et switch, et répéter un travail avec des boucles ;
  • découper un programme en méthodes, et travailler avec des tableaux et des listes ;
  • modéliser mes propres données avec des classes et des records, et gérer les erreurs avec des exceptions ;
  • lire et écrire des fichiers, tester mon code, et utiliser un package NuGet.
# Leçon Notions
1 Installer .NET et exécuter ton premier programme SDK, dotnet run app.cs, instructions, projets, erreurs du compilateur
2 Variables, types et saisie int, double, decimal, string, bool, var, conversions, interpolation, Console.ReadLine
3 Conditions et boucles if, switch, for, foreach, while, break, le débogueur
4 Méthodes, tableaux et listes paramètres, valeurs de retour, tableaux, List<T>, premiers pas avec null
5 Classes et objets champs, propriétés, constructeurs, méthodes, static
6 Records, structs et enums types valeur et types référence, égalité, enum
7 Interfaces et héritage interface, abstract, override, polymorphisme
8 Exceptions et sécurité face à null try/catch/finally, throw, types référence nullables
9 Collections et LINQ Dictionary<TKey, TValue>, HashSet<T>, Where, Select, OrderBy
10 Fichiers et texte File, Path, lire un fichier CSV des projets de Guitar Alchemist
11 Tests unitaires xUnit, dotnet test, tester les méthodes des leçons précédentes
12 Un petit projet une solution avec une bibliothèque, une application console et des tests, un package NuGet, un premier regard sur async
— Journal

Le journal consigne ce que l’écriture et les tests de ce cours ont fait apparaître. Voici les constats qui changent la façon d’écrire ou d’exécuter un programme ; chaque ligne renvoie à la leçon qui l’enseigne et à l’entrée du journal qui contient la mesure.

Ce que le journal a trouvé Pourquoi c’est important Voir
Un Writeline mal orthographié (CS0117) n’est signalé qu’une fois corrigés le ; et le guillemet manquants du même programme : les erreurs de syntaxe cachent les autres Corriger une erreur peut en faire apparaître de nouvelles ; c’est un progrès, pas un recul Leçon 1, journal
double.TryParse("1.5") dépend de la culture : true et 15 en es-ES, où le point sépare les milliers, false en fr-FR Le même programme lit un nombre différent sur une machine espagnole ou française Leçon 2, journal
Les avertissements ne s’affichent que lorsque le SDK compile : un second dotnet run d’un fichier inchangé n’en affiche aucun, même avec --no-cache ; dotnet clean les fait revenir Un avertissement disparu à l’exécution suivante n’est pas corrigé pour autant Leçon 3, journal
Le littéral 0 se convertit en énumération sans cast, et CS8524 avertit pour une expression switch qui a une branche par nom Une variable d’énumération peut contenir un nombre sans nom : le programme de la leçon échoue sur 7 Leçon 6, journal
Un brouillon disait que shape[i].Fret += 2 sur une liste de readonly record struct donne CS1612 ; une sonde compilée avant publication a donné CS8852 Chaque sortie et chaque message d’erreur du cours est collé depuis une exécution, jamais écrit de mémoire Leçon 6, journal
Dans Guitar Alchemist, le ToString() => Name de ChordTemplate n’est pas sealed : ses records dérivés affichent toutes leurs propriétés au lieu du nom de l’accord L’override de la leçon 7 rencontre les records de la leçon 6 dans du vrai code ; un site d’appel de GA journalise le dump. Pas encore signalé à GA Leçon 7, tableau QA
Un avertissement de nullabilité désigne l’endroit où null entre, pas celui où le programme plante : CS8618 se trouve sur la déclaration de la propriété, et la ligne qui plante n’a aucun avertissement Corrige chaque avertissement là où il est, même loin du plantage Leçon 8, journal
Guitar Alchemist fait taire quinze avertissements de nullabilité dans NoWarn, deux fois. Son code n’en a aucun à cacher, mais un fichier de test contenant sept erreurs de nullabilité a compilé sans avertissement Faire taire un avertissement fait aussi taire les erreurs à venir. Pas encore signalé à GA Leçon 8, tableau QA
Le foreach d’un dictionnaire suit l’ordre d’ajout seulement jusqu’au premier Remove : une clé ajoutée ensuite prend la place de la clé retirée Un résultat trié rangé dans un Dictionary reste trié par hasard ; trie quand l’ordre compte Leçon 9, journal
Trois des quatre fichiers YAML que lisent les services de connaissances musicales de Guitar Alchemist ne se chargent pas ; chaque chargeur attrape l’exception et continue avec un seul élément par défaut Un catch qui se contente d’afficher cache le bogue : GA compte 16 artistes, et rien n’échoue. Signalé dans l’issue GA n° 797 ; correctif proposé dans la PR GA n° 808 Leçon 9, tableau QA
Un chemin relatif part du dossier courant, pas du fichier du programme : l10_where.cs trouve data/ga-projects.csv quand dotnet run part de code/csharp-beginner, et le manque depuis la racine du dépôt Le même programme trouve son fichier ou non selon le dossier d’où il part ; un chemin construit à partir de EntryPointFileDirectoryPath marche depuis les deux Leçon 10, journal
La chaîne de format avec laquelle Guitar Alchemist écrit son CSV de naturalité suit la culture de la machine : avec fr-FR, 2.50 devient 2,50, et une ligne de 6 valeurs se coupe en 8 Un fichier écrit sur une machine française ne se relit pas avec Split(',') ; écris les nombres avec CultureInfo.InvariantCulture. Correctif proposé dans la PR GA n° 811 Leçon 10, tableau QA
Les tests de Guitar Alchemist pour ses services YAML réussissent alors que trois des quatre fichiers ne se chargent pas : trois tests sont ignorés, et les autres vérifient « plus que zéro », ce que satisfait le seul élément par défaut Un test qui vérifie seulement « plus que zéro » ne voit pas une valeur de repli ; vérifie la vraie valeur. Correctif proposé dans la PR GA n° 808 Leçon 11, tableau QA
Avec ses arguments inversés, Assert.Equal appelle « Expected » le résultat de la méthode et « Actual » la valeur du test ; la règle d’analyseur xUnit2000 le signale avant que les tests tournent La valeur attendue vient en premier ; lis aussi les avertissements de la compilation des tests Leçon 11, journal
dotnet test dans le dossier d’une solution ne compile que les projets de test et ce qu’ils référencent : avec une erreur de compilation dans l’application console, les tests réussissent quand même et se terminent avec le code 0 Lance aussi dotnet build avant de te fier à des tests au vert Leçon 12, journal
Dans le Directory.Build.props de Guitar Alchemist, les lignes PackageReference Update censées aligner les versions des packages ne changent rien : le fichier est importé avant les éléments propres des projets Vérifie la version que choisit une restauration ; Directory.Build.targets ou la gestion centralisée des packages font ce que ces lignes visent. Correctif proposé dans la PR GA n° 812 Leçon 12, tableau QA
  • Un ordinateur sous Windows 10 ou 11, une distribution Linux récente (ou WSL), ou macOS 14 ou plus récent.
  • Environ 1 Go d’espace disque pour le SDK .NET.
  • Un terminal : la leçon 1 explique comment en ouvrir un.
  • Un éditeur : Visual Studio Code avec l’extension C# Dev Kit, Visual Studio sous Windows, ou JetBrains Rider. La leçon 1 les compare.

Un cours C# avancé, écrit en même temps que celui-ci, commence là où il s’arrête : la mémoire, le ramasse-miettes, async sous le capot et les performances mesurées. Les cours Java pour développeurs C# et Rust pour développeurs C#/Java partent de C#.