Collections et exceptions
Ce que tu vas apprendre
- Garder plusieurs valeurs dans une
Listet les retrouver par clé dans unDictionary. - Comprendre ce qu'est une exception et l'attraper avec
tryetcatch. - Convertir une saisie sans faire planter le programme.
La liste
Une recette a plusieurs ingrédients. Une liste (List<T>) garde une série de valeurs du même type, dans l'ordre, et peut grandir.
var ingredients = new List<string> { "farine", "oeufs", "lait" };
ingredients.Add("sucre");
ingredients.Remove("lait");
Console.WriteLine(ingredients.Count); // 3
Console.WriteLine(ingredients[0]); // farine
Le type entre chevrons, <string>, indique ce que la liste contient. On l'appelle le type générique.
Les éléments sont numérotés à partir de 0 : le premier est ingredients[0]. Demander un numéro qui n'existe pas provoque une erreur.
Parcourir et tester une liste
Tu utilises foreach pour parcourir une liste :
foreach (string ingredient in ingredients)
{
Console.WriteLine($"- {ingredient}");
}
if (ingredients.Contains("sucre"))
{
Console.WriteLine("Il y a du sucre");
}
| Membre | Effet |
|---|---|
Add(x) | Ajoute à la fin |
Remove(x) | Retire la première occurrence |
Contains(x) | Dit si la valeur est présente |
Count | Nombre d'éléments |
[i] | Lit l'élément numéro i |
Le dictionnaire
Un dictionnaire (Dictionary<TKey, TValue>) associe une clé à une valeur, comme un carnet où tu retrouves un prix à partir d'un nom.
var prix = new Dictionary<string, double>
{
["Crêpes"] = 3.5,
["Gaufres"] = 4.0
};
prix["Tarte"] = 5.5;
Console.WriteLine(prix["Crêpes"]); // 3.5
Chaque clé est unique. Écrire prix["Tarte"] = ... ajoute l'entrée si elle n'existe pas, ou remplace sa valeur sinon.
Chercher sans risque avec TryGetValue
Lire prix["Pizza"] alors que cette clé n'existe pas provoque une erreur. Pour tester d'abord, utilise TryGetValue :
if (prix.TryGetValue("Pizza", out double valeur))
{
Console.WriteLine($"Prix : {valeur}");
}
else
{
Console.WriteLine("Recette inconnue");
}
La méthode renvoie true si la clé existe et, dans ce cas, remplit la variable après out. Le mot-clé out signifie que la méthode renvoie une seconde valeur par ce paramètre.
Pour parcourir un dictionnaire, chaque élément porte une Key et une Value :
foreach (var paire in prix)
{
Console.WriteLine($"{paire.Key} : {paire.Value}");
}
Les exceptions
Parfois, le programme rencontre une situation impossible : une division par zéro, un fichier absent, un texte qui n'est pas un nombre. Il lève alors une exception, un objet qui décrit l'erreur. Sans traitement, le programme s'arrête.
int portions = int.Parse("quatre"); // lève une FormatException
Pour réagir, entoure le code risqué d'un bloc try et récupère l'erreur dans un bloc catch :
try
{
int portions = int.Parse("quatre");
Console.WriteLine(portions);
}
catch (FormatException)
{
Console.WriteLine("Ce n'est pas un nombre");
}
Si aucune erreur n'a lieu dans try, le bloc catch est ignoré. Sinon, le programme saute directement au catch correspondant.
finally et throw
Le bloc finally s'exécute dans tous les cas, avec ou sans erreur. Il sert à libérer ce qui a été ouvert (un fichier, une connexion).
try
{
Console.WriteLine("Lecture de la recette");
}
catch (Exception ex)
{
Console.WriteLine($"Erreur : {ex.Message}");
}
finally
{
Console.WriteLine("Fin du traitement");
}
Exception est le type de base : catch (Exception ex) attrape toutes les erreurs, et ex.Message donne le texte de l'erreur. Mets les catch précis avant les catch généraux.
Tu peux aussi lever toi-même une exception avec throw :
static void VerifierPortions(int portions)
{
if (portions <= 0)
{
throw new ArgumentException("Les portions doivent être positives");
}
}
throw; seul dans le catch. Tu gardes ainsi les informations d'origine.Préférer TryParse pour les saisies
Une saisie incorrecte est un cas normal, pas une situation exceptionnelle. Pour convertir un texte en nombre, int.TryParse évite l'exception :
Console.WriteLine("Combien de portions ?");
string? saisie = Console.ReadLine();
if (int.TryParse(saisie, out int portions))
{
Console.WriteLine($"Recette pour {portions} personnes");
}
else
{
Console.WriteLine("Merci de saisir un nombre entier");
}
try et catch aux vrais imprévus (fichier manquant, réseau coupé). Pour les cas que tu peux tester avant, un if ou un TryParse est plus simple et plus clair.À retenir
List<T>garde des valeurs dans l'ordre :Add,Remove,Contains,Count, et[i]à partir de 0.Dictionary<TKey, TValue>associe une clé unique à une valeur ; utiliseTryGetValuequand la clé peut manquer.- Une exception décrit une erreur à l'exécution ; sans
catch, le programme s'arrête. tryentoure le code risqué,catchtraite l'erreur,finallys'exécute dans tous les cas,throwlève une erreur.- Pour une saisie,
int.TryParseest préférable àint.Parsesuivi d'uncatch.
Pour aller plus loin
Sources officielles
Ensuite
Conditions, boucles et méthodes
Prendre des décisions avec if et switch, répéter avec for, foreach et while, et ranger son code dans des méthodes réutilisables.
Classes, propriétés et records
Modéliser une recette avec une classe, ses propriétés et son constructeur, puis découvrir les records pour des données simples comparables par valeur.
- Projet
- Lignes de code
- Niveau
- Le quartier
- Appartement
- C#
- Pièce
- 3/7
- Plan n°
- csharp/03.collections-et-exceptions