Explorez un starter code, gérez fichiers et erreurs en C#

Dans les chapitres précédents, vous avez préparé votre environnement .NET, traduit les briques logiques en C# et modélisé vos données dans une classe. Dans ce dernier chapitre, vous allez apprendre à vous repérer dans un starter code C# réel, du type de ceux que vous rencontrerez en projet ou en équipe.

Vous allez identifier les fichiers importants d'un projet, comprendre le rôle des namespaces et du fichier.csproj, suivre le point d'entrée du programme, lire un fichier de données et gérer les erreurs les plus fréquentes.

Repérez les fichiers importants d'un projet C#

Un projet C# .NET est souvent organisé comme ceci :

ProductCatalog/
├── Program.cs
├── Product.cs
├── ProductCatalog.csproj
└── products.csv

Dans cette structure :

  • Program.cscontient le point d'entrée du programme (souvent la méthodeMainou les top-level statements) ;

  • Product.cscontient la classeProduct(celle du chapitre précédent) ;

  • ProductCatalog.csprojest le fichier de configuration du projet ;

  • products.csvcontient les données utilisées par le programme.

Quand vous ouvrez un starter code, cherchez d'abord ces quatre éléments : ils vous donnent une première carte du projet.

Comprenez le rôle du fichier.csproj

Le fichier.csprojest un fichier XML lu par la commandedotnet. Il décrit :

  • la version de .NET ciblée (<TargetFramework>net10.0</TargetFramework>) ;

  • les dépendances externes du projet (paquets NuGet) ;

  • la manière dont le projet doit être compilé (type d'application, options).

Vous n'avez généralement pas besoin de le modifier à la main quand vous débutez :dotnet new consolele génère, et des commandes commedotnet add package NomDuPaquetviennent le compléter automatiquement. Mais retenez que c'est ce fichier que dotnet lit pour savoir comment compiler et exécuter votre projet.

Comprenez les namespaces

Dans un projet C#, chaque classe appartient à un namespace : un identifiant qui regroupe des types entre eux et évite les conflits de noms. Vous verrez souvent, en haut des fichiers d'un starter code :

Ou, sous forme historique avec accolades :

De l'autre côté, quand vous voulez utiliser une classe définie dans un autre namespace, vous écrivez une directiveusingen haut du fichier :

  • using System;rend accessibles les types de base (Console,String, etc.).

  • using System.IO;rend accessibles les types pour lire/écrire des fichiers (File,StreamReader, etc.).

  • using ProductCatalog;rend accessibles vos propres classes placées dans ce namespace.

Suivez le point d'entrée du programme

Quand vous lisez un code C# existant, cherchez d'abordProgram.cs. Deux formes cohabitent :

Forme moderne (top-level statements) :

Forme classique (encore très présente en entreprise) :

Dans les deux cas, le résultat affiché est le même :

Chargement du catalogue...

Dans la forme classique, la méthodeMainest le point d'entrée.static void Main(string[] args)signifie : une méthode statique (appartenant à la classe, pas à une instance), sans valeur de retour, qui reçoit les arguments passés en ligne de commande dansargs.

Pour lire le code, retrouvez la méthodeMain(ou le début deProgram.csen top-level statements) et suivez le fil d'exécution ligne par ligne.

Suivez une méthode appelée depuisMain

Dans un starter code,Maindélègue souvent le travail à d'autres méthodes. Prenons cet exemple :

Résultat affiché :

Sac à dos - stock : 12

Pour comprendre ce résultat, remontez du dernier appel jusqu'à la méthode déclarée :

  • la ligneDisplayProduct("Sac à dos", 12);appelle une méthode ;

  • retrouvez la méthode qui porte le même nom ;

  • suivez les valeurs envoyées dans les paramètres (name = "Sac à dos",stock = 12) ;

  • identifiez la ligne qui produit l'affichage.

C'est le même réflexe que dans n'importe quel langage : pour lire un code, suivez les appels et regardez ce qu'ils reçoivent en paramètres.

Lisez un fichier avecSystem.IOet le mot-cléusing

Pour lire un fichier en C#, vous utilisez les types du namespaceSystem.IO. Voici un exemple simple, oùproducts.csvcontient une ligne par produit :

Sac à dos,45.90,12
Carnet,4.50,0
Stylo,1.20,30

En C# moderne, la façon la plus concise de lire toutes les lignes est :

File.ReadAllLines(...)renvoie un tableaustring[]contenant chaque ligne du fichier, que vous pouvez ensuite parcourir avecforeach.

Quand vous avez besoin de plus de contrôle (lire ligne par ligne sans tout charger en mémoire, par exemple), vous utiliserez plutôt unStreamReader. C'est à ce moment que le mot-cléusingentre en jeu :

Ou, plus concis avec la forme de déclarationusingintroduite en C# 8 :

Le deuxième usage (usingen bloc ou en déclaration) est crucial : il indique à C# que la ressource implémenteIDisposable, et que sa méthodeDispose()doit être appelée dès que vous en avez fini. Sans cela, le fichier pourrait rester ouvert et bloquer d'autres traitements.

Décomposez une ligne CSV

Afficher les lignes est utile pour vérifier la lecture, mais vous voudrez souvent séparer les valeurs d'une ligne. Le format CSV (Comma-Separated Values) sert justement à cela : chaque ligne contient des valeurs séparées par des virgules.

À partir de la ligne :

Sac à dos,45.90,12

vous pouvez utiliser la méthodeSplitdestring:

Cela affiche :

Sac à dos - 45,90 € - stock : 12

Quelques points clés :

  • Split(',')découpe la chaîne à chaque virgule et renvoie unstring[];

  • parts[0],parts[1],parts[2]sont toujours desstring;

  • decimal.TryParse(...)etint.TryParse(...)tentent de convertir un texte en nombre sans faire planter le programme si la valeur est invalide.

Le paramètreCultureInfo.InvariantCulture(à importer avecusing System.Globalization;) évite les surprises liées à la locale : dans certains pays, le séparateur décimal est une virgule ; en utilisantInvariantCulture, vous dites à C# de traiter le point comme séparateur décimal, ce qui correspond au format CSV lu ici.TryParserenvoie unbool: si la conversion réussit, il vauttrueet la valeur convertie est disponible dans la variable déclarée avecout; sinon, il vautfalseet vous pouvez afficher un message clair ou ignorer la ligne.

Gérez une erreur avectry/catch

Quand un programme lit un fichier et convertit des valeurs, plusieurs erreurs peuvent survenir : le fichier n'existe pas, une ligne est mal formée, un nombre est invalide. En C#, ces situations sont modélisées par des exceptions.

Voici un cas simple : convertir un texte qui n'est pas un nombre enint.

Ce code compile, mais provoque à l'exécution une exceptionFormatException:int.Parseattend un nombre comme"12", pas un mot.

Pour gérer proprement ce cas, entourez le code sensible avectryetcatch:

Cette fois, si la conversion échoue, le programme passe danscatchet affiche :

Stock invalide, ligne ignorée.

Vous pouvez aussi gérer plusieurs types d'erreurs distinctement, par exemple pour un fichier absent :

Dans cet exemple :

  • catch (FileNotFoundException)intercepte le cas où le fichier n'existe pas ;

  • catch (Exception ex)sert de filet de sécurité pour toutes les autres erreurs ;

  • ex.Messagerécupère le message d'erreur associé à l'exception.

Aller plus loin : suivez les évolutions de .NET

La plateforme .NET évolue à un rythme soutenu : chaque version majeure améliore les performances de l'interpréteur, enrichit la ligne de commandedotnetet ajoute de nouvelles fonctionnalités au langage.

À vous de jouer

Votre équipe a exporté le menu du jour au format CSV. Créez un fichier menu.csvà la racine de votre projet (encodage UTF-8) et collez-y ces 4 lignes :

Pizza,12
Salade,8
Burger,10
Tiramisu,6

Votre mission : afficher chaque plat au formatPizza — 12 €en lisant le fichier, et gérer proprement le cas où le fichier est introuvable.

Votre mission :

  1. Dans un bloctry, chargez toutes les lignes demenu.csvavecFile.ReadAllLines("menu.csv").

  2. Parcourez le tableau retourné avecforeach, découpez chaque ligne avecSplit(','), puis vérifiez que la ligne contient bien au moins deux colonnes avant d'accéder au nom et au prix.

  3. AffichezPizza — 12 €avec une chaîne interpolée.

  4. Dans un bloccatch (FileNotFoundException), affichez un message ciblé si le fichier est absent, puis ajoutez uncatch (Exception ex)en dernier pour gérer les autres erreurs possibles.

En résumé

  • Un projet C# type contientProgram.cs(point d'entrée), une ou plusieurs classes (Product.cs…), un fichier.csproj(configuration) et éventuellement des fichiers de données (.csv,.json…).

  • Les namespaces regroupent des types et évitent les conflits de noms ; la directiveusingen haut de fichier permet d'utiliser les types d'un autre namespace.

  • Pour lire un fichier, utilisezSystem.IO:File.ReadAllLines(...)pour un usage simple, ou unStreamReadercombiné à unusing de libération qui garantit la fermeture automatique de la ressource.

  • Split(',')décompose une ligne CSV enstring[];decimal.TryParse(...)etint.TryParse(...)tentent de convertir les valeurs vers les bons types sans lever d'exception si la conversion échoue.

  • try/catch (TypeException)permet de gérer une erreur avec un message utile ;FormatExceptionetFileNotFoundExceptionsont deux exceptions particulièrement fréquentes.

Vous avez maintenant tous les repères pour lire un code C# simple, manipuler des données et gérer les erreurs les plus courantes. Pour vérifier que ces notions sont claires, passez maintenant au quiz du cours.

Ever considered an OpenClassrooms diploma?
  • Up to 100% of your training program funded
  • Flexible start date
  • Career-focused projects
  • Individual mentoring
Find the training program and funding option that suits you best