Menu
Coddy logo textTech

Champs de support

Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 17 sur 70.

Les propriétés auto-implémentées sont pratiques, mais vous avez parfois besoin de plus de contrôle sur la façon dont une propriété stocke ou récupère sa valeur. C'est là que les champs de stockage interviennent. Un champ de stockage est un champ privé qui stocke les données réelles d'une propriété.

public class Product
{
    private decimal _price;  // Champ de stockage
    
    public decimal Price
    {
        get { return _price; }
        set { _price = value; }
    }
}

Cela semble représenter un travail supplémentaire par rapport aux propriétés automatiques, mais les champs de stockage vous permettent d'ajouter de la logique. Par exemple, vous pouvez valider les données avant de les stocker :

public class Product
{
    private decimal _price;
    
    public decimal Price
    {
        get => _price;
        set => _price = value < 0 ? 0 : value;
    }
}

Désormais, les prix négatifs deviennent automatiquement zéro. Vous pouvez également transformer les données lors de la lecture ou de l'écriture, enregistrer les modifications ou déclencher d'autres actions.

La convention de nommage des champs d'appui utilise généralement un préfixe de soulignement (_price) ou des minuscules (price) pour le distinguer de la propriété.

Lorsque vous utilisez des propriétés auto-implémentées comme public decimal Price { get; set; }, le compilateur crée en réalité un champ de stockage (backing field) masqué pour vous. Les champs de stockage explicites vous offrent le même stockage avec un contrôle total sur le comportement.

challenge icon

Défi

Facile

Construisons un système de capteur de température qui utilise des champs d'accompagnement (backing fields) pour valider et transformer les données lors de leur stockage et de leur récupération.

Vous allez créer deux fichiers pour organiser votre code :

  • TemperatureSensor.cs : Définissez une classe TemperatureSensor dans l'espace de noms Sensors. Ce capteur mesure la température en Celsius, mais nous devons nous assurer que les relevés restent dans des limites valides. Utilisez des champs d'accompagnement pour implémenter les éléments suivants :
    • Une propriété Location (string) avec un champ d'accompagnement _location. Lors de la définition de l'emplacement, si la valeur est nulle ou vide, stockez "Unknown" à la place.
    • Une propriété Temperature (double) avec un champ d'accompagnement _temperature. Lors du réglage de la température, limitez la valeur entre -50 et 150 (si elle est inférieure à -50, stockez -50 ; si elle est supérieure à 150, stockez 150).
    • Une propriété en lecture seule TemperatureFahrenheit qui calcule et renvoie la température en Fahrenheit en utilisant la formule : (celsius * 9 / 5) + 32. Celle-ci doit utiliser directement le champ d'accompagnement.
    • Un constructeur qui accepte l'emplacement et les valeurs de température initiales.
  • Program.cs : Dans votre fichier principal, créez un capteur en utilisant les valeurs d'entrée et affichez ses relevés. Ensuite, mettez à jour la température avec une deuxième valeur d'entrée et affichez les relevés mis à jour.

Vous recevrez trois entrées :

  • L'emplacement du capteur
  • Le relevé de température initial
  • Le relevé de température mis à jour

Affichez la sortie dans ce format :

Sensor: {Location}
Temperature: {Temperature}C ({TemperatureFahrenheit}F)
Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)

Par exemple, si les entrées sont Lab Room, 25, et 200, la sortie devrait être :

Sensor: Lab Room
Temperature: 25C (77F)
Updated Temperature: 150C (302F)

Remarquez comment le deuxième relevé de 200 est limité à 150 car il dépasse la température maximale valide. Vos champs d'accompagnement vous donnent ce contrôle sur la façon dont les données sont stockées !

Aide-mémoire

Un champ de stockage (backing field) est un champ privé qui stocke les données réelles d'une propriété, vous permettant d'ajouter une logique personnalisée pour l'obtention et la définition des valeurs.

Syntaxe de base d'un champ de stockage

public class Product
{
    private decimal _price;  // Champ de stockage
    
    public decimal Price
    {
        get { return _price; }
        set { _price = value; }
    }
}

Syntaxe de corps d'expression

public decimal Price
{
    get => _price;
    set => _price = value;
}

Ajout d'une logique de validation

Les champs de stockage vous permettent de valider ou de transformer les données avant de les stocker :

private decimal _price;

public decimal Price
{
    get => _price;
    set => _price = value < 0 ? 0 : value;  // Empêche les prix négatifs
}

Convention de nommage

Les champs de stockage utilisent généralement un préfixe de soulignement (_price) ou des minuscules (price) pour les distinguer du nom de la propriété.

Propriétés auto-implémentées vs Champs de stockage

Les propriétés auto-implémentées comme public decimal Price { get; set; } créent automatiquement un champ de stockage masqué. Les champs de stockage explicites vous offrent le même stockage avec un contrôle total sur le comportement.

Essayez vous-même

using System;
using Sensors;

class Program
{
    public static void Main(string[] args)
    {
        // Lire les entrées
        string location = Console.ReadLine();
        double initialTemp = Convert.ToDouble(Console.ReadLine());
        double updatedTemp = Convert.ToDouble(Console.ReadLine());

        // TODO: Créer un TemperatureSensor avec l'emplacement et la température initiale

        // TODO: Afficher l'emplacement du capteur et les relevés de température initiaux
        // Format: "Sensor: {Location}"
        // Format: "Temperature: {Temperature}C ({TemperatureFahrenheit}F)"

        // TODO: Mettre à jour la température du capteur avec la valeur mise à jour

        // TODO: Afficher les relevés de température mis à jour
        // Format: "Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)"
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet