Classes, propriétés et records
Ce que tu vas apprendre
- Écrire une classe avec des propriétés, un constructeur et une méthode.
- Protéger les données d'un objet avec
private. - Utiliser un
recordpour des données simples, comparées par leur contenu.
Pourquoi une classe
Jusqu'ici, une recette était une simple variable string. Or une recette a un nom, un temps de préparation et des ingrédients. Une classe regroupe ces informations et les actions associées dans un même modèle.
Une classe est un plan. Un objet est un exemplaire construit à partir de ce plan. Avec une classe Recette, tu peux créer autant de recettes que tu veux.
Une première classe
public class Recette
{
public string Nom { get; set; }
public int Minutes { get; set; }
public Recette(string nom, int minutes)
{
Nom = nom;
Minutes = minutes;
}
public string Resume() => $"{Nom} ({Minutes} min)";
}
Cette classe contient trois éléments :
- Deux propriétés,
NometMinutes: des données de l'objet, lues et modifiées avecgetetset. - Un constructeur, une méthode qui porte le nom de la classe et prépare l'objet à sa création.
- Une méthode
Resumequi utilise les propriétés.
Le mot-clé public rend l'élément accessible depuis l'extérieur de la classe.
Créer et utiliser un objet
Avec le mot-clé new, tu appelles le constructeur :
var crepes = new Recette("Crêpes", 30);
Console.WriteLine(crepes.Nom);
Console.WriteLine(crepes.Resume());
crepes.Minutes = 25;
L'écriture objet.Membre accède à une propriété ou à une méthode. Chaque objet garde ses propres valeurs : modifier crepes ne change pas une autre recette.
Recette.cs) ou après le code de Program.cs. Un fichier par classe reste plus simple à relire.Protéger les données
Rien n'empêche aujourd'hui d'écrire crepes.Minutes = -5. Pour contrôler une valeur, tu peux limiter son écriture.
public class Recette
{
public string Nom { get; }
public int Minutes { get; private set; }
public Recette(string nom, int minutes)
{
Nom = nom;
Minutes = minutes;
}
public void Rallonger(int minutes)
{
if (minutes > 0) Minutes += minutes;
}
}
Nom { get; }n'a pas deset: elle se fixe dans le constructeur puis ne change plus.private setautorise la modification seulement à l'intérieur de la classe.
Le reste du programme passe désormais par Rallonger, qui vérifie la valeur. On appelle cette idée l'encapsulation.
| Niveau d'accès | Qui peut utiliser le membre |
|---|---|
public | Tout le programme |
private | La classe elle-même |
protected | La classe et ses classes filles (voir le chapitre suivant) |
Les records
Beaucoup de classes ne servent qu'à porter des données. Un record est fait pour cela : en une ligne, tu obtiens les propriétés, le constructeur et d'autres comportements utiles.
public record Ingredient(string Nom, int Quantite);
var farine = new Ingredient("farine", 250);
Console.WriteLine(farine); // Ingredient { Nom = farine, Quantite = 250 }
La liste entre parenthèses déclare des propriétés en lecture seule, remplies à la création. L'affichage d'un record est déjà lisible, sans code de plus.
Égalité par valeur et with
Deux objets d'une classe ordinaire sont égaux seulement s'ils sont le même objet. Deux records sont égaux quand leur contenu est identique :
var a = new Ingredient("farine", 250);
var b = new Ingredient("farine", 250);
Console.WriteLine(a == b); // True
Un record ne se modifie pas. Pour obtenir une copie avec un changement, utilise with :
var plusDeFarine = a with { Quantite = 500 };
Console.WriteLine(plusDeFarine); // Ingredient { Nom = farine, Quantite = 500 }
L'objet a reste inchangé. Cette copie contrôlée évite des modifications par accident.
Classe ou record
| Besoin | Choix |
|---|---|
| Un objet qui change au fil du programme, avec des règles | class |
| Une donnée simple, comparée par son contenu | record |
record pour tout ce qui décrit une donnée (un ingrédient, un prix, un résultat) et sur une class pour ce qui a un comportement et un état qui évolue (un panier de courses).À retenir
- Une classe est un plan ;
newen crée un objet en appelant son constructeur. - Une propriété expose une donnée avec
getetset;private setou l'absence desetla protège. publicouvre un membre à tout le programme,privatele réserve à la classe.- Un
recorddéclare des données en une ligne, s'affiche lisiblement et se compare par son contenu. withfabrique une copie d'un record avec une valeur changée.
Pour aller plus loin
Sources officielles
Ensuite
Collections et exceptions
Stocker plusieurs valeurs avec List et Dictionary, puis gérer les erreurs d'exécution avec try, catch et finally.
Héritage et interfaces
Réutiliser du code avec l'héritage, redéfinir un comportement avec virtual et override, et décrire un contrat commun avec une interface.
- Projet
- Lignes de code
- Niveau
- Le quartier
- Appartement
- C#
- Pièce
- 4/7
- Plan n°
- csharp/04.classes-proprietes-records