
Vous connaissez déjà les concepts de classe, d'objet, de propriété et d'encapsulation. Dans ce chapitre, vous allez apprendre à traduire ces concepts en C# : déclarer une classe, ajouter des propriétés avec{ get; set; }, instancier un objet, initialiser ses propriétés avec un constructeur, et encapsuler ce qui doit rester interne à la classe.
Une classe est une structure qui décrit un type d'objet, avec ses données (les propriétés) et ses comportements (les méthodes). En C#, une classe se déclare avec le mot-cléclass:
Productest le nom de la classe (par convention enPascalCase). Le corps de la classe est entre{ }— pour l'instant vide. On préfixe la classe parpublic: c'est la convention la plus courante en C# pour que la classe soit utilisable partout dans le projet.
Placez cette déclaration dans un fichierProduct.cs(le fichier porte, par convention, le même nom que la classe). Elle peut aussi rester dansProgram.csau début, mais sur des projets un peu plus grands, on sépare une classe par fichier.
{ get; set; }Les propriétés sont les données que porte un objetProduct. En C#, la manière idiomatique de les déclarer utilise les auto-propriétés avec{ get; set; }:
public: la propriété est accessible depuis l'extérieur de la classe ;
string,decimal,int: le type de la propriété ;
Name,Price,Stock: le nom de la propriété (enPascalCase) ;
{ get; set; }: dit à C# de générer automatiquement une lecture (get) et une écriture (set).
Cette forme est très caractéristique de C# : l'IDE et le compilateur s'occupent de générer le stockage sous-jacent, vous n'écrivez pas les getters/setters à la main.
Pour créer un objet à partir d'une classe, utilisez le mot-clénew. Vous pouvez initialiser les propriétés directement avec un initialiseur d'objet :
new Product { ... }crée une instance deProduct, puis affecte les propriétés listées. Vous accédez ensuite aux propriétés avec.(backpack.Name,backpack.Price).
L’initialiseur d’objet que vous venez de voir est pratique, mais chaque propriété y reste facultative : rien n’empêche d’oublierNameouPrice. Un constructeur sert au contraire à imposer certaines valeurs au moment où l’objet est créé. En C#, il porte le même nom que la classe et n’a pas de type de retour :
On peut ensuite créer unProductavec ses valeurs directement :
Le constructeur reçoit les paramètres, puis affecte chacun d'eux à la propriété correspondante. C'est particulièrement utile quand vous voulez imposer qu'aucunProductne puisse exister sans nom ni prix.
En C#, vous contrôlez la visibilité de chaque membre d'une classe avec des modificateurs d'accès. Les deux plus utiles au quotidien :
public: accessible depuis l'extérieur de la classe ;
private: accessible uniquement depuis l'intérieur de la classe.
Par exemple, si vous voulez qu'une propriété soit lisible partout mais modifiable uniquement à l'intérieur de la classe (par exemple dans le constructeur ou une méthode dédiée), utilisezpublic string Name { get; private set; }:
Depuis l'extérieur, vous pouvez lirebackpack.Name, maisbackpack.Name = "Autre chose";provoquera une erreur de compilation. C'est un des moyens en C# de garantir que l'état d'un objet reste cohérent.
Une méthode peut utiliser les propriétés de l'objet directement (sans les passer en paramètre) :
Depuis l'extérieur :
IsAvailablen'a pas besoin de recevoir le stock : elle lit directement la propriétéStockde l'objet sur lequel elle est appelée.
Une classe permet de créer autant d'objets que nécessaire. Vous pouvez les ranger dans uneList<Product>pour les manipuler ensemble :
Cela combine ce que vous avez vu au chapitre précédent (List<T>,foreach) avec la classeProductde ce chapitre.

Votre équipe veut représenter chaque plat de l'application par un objet, avec ses informations (nom, prix, disponibilité) et sa propre façon de se décrire. Voici le squelette à compléter :
Votre mission :
Complétez la classeDishavec 3 propriétés{ get; private set; }:Name(string),Price(decimal),Available(bool), puis ajoutez un constructeurDish(string name, decimal price, bool available)qui affecte chaque paramètre à la propriété correspondante.
Ajoutez une méthodeDescribe()qui retourne unstringau formatPizza (12 €) - disponible(ou- indisponiblesiAvailablevautfalse).
DansProgram.cs, créez deux plats : unePizzaà12m €disponible, unTiramisuà6m €indisponible. AppelezDescribe()sur chacun et affichez le résultat avecConsole.WriteLine.
Une classe se déclare avecclass NomClasse { ... }et utilise la syntaxe idiomatiquepublic Type Nom { get; set; }pour ses propriétés.
On crée un objet avecnew NomClasse(...), éventuellement complété par un initialiseur d'objet{ Nom = ... }.
Un constructeur porte le nom de la classe et n'a pas de type de retour ; il garantit qu'un objet est créé dans un état cohérent.
L'encapsulation repose surpublic/private;{ get; private set; }rend une propriété lisible mais non modifiable de l'extérieur.
Une méthode d'instance peut lire et manipuler les propriétés de l'objet sans les recevoir en paramètre.
Vous savez maintenant modéliser et encapsuler des données dans une classe C#. Dans le dernier chapitre, vous allez apprendre à vous repérer dans un starter code C# réel, à lire un fichier de données et à gérer les erreurs les plus courantes.