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 implémentées automatiquement comme public decimal Price { get; set; }, le compilateur crée en réalité un champ de stockage masqué pour vous. Les champs de stockage explicites vous offrent le même espace de stockage, avec un contrôle total sur le comportement.
Défi
FacileConstruisons un système de capteur de température qui utilise des champs de stockage pour valider et transformer les données lors de leur enregistrement 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 de stockage pour implémenter les éléments suivants :- Une propriété
Location(string) avec un champ de stockage_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 de stockage_temperature. Lors de la définition 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 à l'aide de la formule :(celsius * 9 / 5) + 32. Elle doit utiliser directement le champ de stockage. - Un constructeur qui accepte les valeurs de l'emplacement et de la température initiale.
- Une propriété
Program.cs: Dans votre fichier principal, créez un capteur à l'aide de valeurs saisies et affichez ses relevés. Mettez ensuite à jour la température avec une deuxième valeur saisie et affichez les relevés mis à jour.
Vous recevrez trois entrées :
- Emplacement du capteur
- Relevé de température initial
- 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 de stockage vous donnent ce contrôle sur la manière dont les données sont enregistrées !
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 UtilisateurLogique du système d'empruntLINQ pour la rechercheInterface Console / Interface d'administrationTests unitaires (NUnit/xUnit)Entraînez-vous par vous-même : Compilateur C# en ligne