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.
Défi
FacileConstruisons 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 classeTemperatureSensordans l'espace de nomsSensors. 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-50et150(si elle est inférieure à -50, stockez -50 ; si elle est supérieure à 150, stockez 150). - Une propriété en lecture seule
TemperatureFahrenheitqui 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.
- Une propriété
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)"
}
}
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
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et Utilisateur