Backing Fields
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy. Lektion 17 von 70.
Automatisch implementierte Eigenschaften sind praktisch, aber manchmal benötigst du mehr Kontrolle darüber, wie eine Eigenschaft ihren Wert speichert oder abruft. Hier kommen Backing-Felder ins Spiel. Ein Backing-Feld ist ein privates Feld, das die tatsächlichen Daten einer Eigenschaft speichert.
public class Product
{
private decimal _price; // Backing-Feld
public decimal Price
{
get { return _price; }
set { _price = value; }
}
}Das wirkt im Vergleich zu automatisch implementierten Eigenschaften wie zusätzliche Arbeit, aber Sicherungsfelder ermöglichen es dir, Logik hinzuzufügen. Du kannst beispielsweise Daten vor dem Speichern validieren:
public class Product
{
private decimal _price;
public decimal Price
{
get => _price;
set => _price = value < 0 ? 0 : value;
}
}Jetzt werden negative Preise automatisch zu Null. Sie können Daten auch beim Lesen oder Schreiben transformieren, Änderungen protokollieren oder andere Aktionen auslösen.
Die Namenskonvention für das zugrunde liegende Feld verwendet typischerweise ein Unterstrich-Präfix (_price) oder Kleinschreibung (price), um es von der Eigenschaft zu unterscheiden.
Wenn du automatisch implementierte Eigenschaften wie public decimal Price { get; set; } verwendest, erstellt der Compiler tatsächlich ein verborgenes Hintergrundfeld für dich. Explizite Hintergrundfelder bieten dir denselben Speicher mit vollständiger Kontrolle über das Verhalten.
Aufgabe
EinfachWir erstellen ein Temperatursensorsystem, das Hintergrundfelder verwendet, um Daten bei ihrer Speicherung und ihrem Abruf zu validieren und umzuwandeln.
Du erstellst zwei Dateien, um deinen Code zu organisieren:
TemperatureSensor.cs: Definiere eineTemperatureSensor-Klasse im NamespaceSensors. Dieser Sensor misst die Temperatur in Celsius, aber wir müssen sicherstellen, dass die Messwerte innerhalb gültiger Grenzen bleiben. Verwende Hintergrundfelder, um Folgendes zu implementieren:- Eine
Location-Eigenschaft (string) mit einem Hintergrundfeld_location. Wenn der Standort festgelegt wird und der Wert null oder leer ist, speichere stattdessen"Unknown". - Eine
Temperature-Eigenschaft (double) mit einem Hintergrundfeld_temperature. Begrenze beim Festlegen der Temperatur den Wert auf den Bereich zwischen-50und150(wenn er unter -50 liegt, speichere -50; wenn er über 150 liegt, speichere 150). - Eine schreibgeschützte Eigenschaft
TemperatureFahrenheit, die die Temperatur in Fahrenheit mithilfe der Formel(celsius * 9 / 5) + 32berechnet und zurückgibt. Dabei soll das Hintergrundfeld direkt verwendet werden. - Einen Konstruktor, der Standort- und Anfangstemperaturwerte akzeptiert.
- Eine
Program.cs: Erstelle in deiner Hauptdatei einen Sensor mithilfe von Eingabewerten und gib seine Messwerte aus. Aktualisiere anschließend die Temperatur mit einem zweiten Eingabewert und zeige die aktualisierten Messwerte an.
Du erhältst drei Eingaben:
- Sensorstandort
- Anfangstemperaturmesswert
- Aktualisierter Temperaturmesswert
Gib die Ausgabe in diesem Format aus:
Sensor: {Location}
Temperature: {Temperature}C ({TemperatureFahrenheit}F)
Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)Wenn die Eingaben beispielsweise Lab Room, 25 und 200 lauten, sollte die Ausgabe wie folgt aussehen:
Sensor: Lab Room
Temperature: 25C (77F)
Updated Temperature: 150C (302F)Beachte, wie der zweite Messwert 200 auf 150 begrenzt wird, weil er die maximal gültige Temperatur überschreitet. Deine Hintergrundfelder geben dir Kontrolle darüber, wie Daten gespeichert werden!
Probier es selbst
using System;
using Sensors;
class Program
{
public static void Main(string[] args)
{
// Eingaben lesen
string location = Console.ReadLine();
double initialTemp = Convert.ToDouble(Console.ReadLine());
double updatedTemp = Convert.ToDouble(Console.ReadLine());
// TODO: Erstellen Sie einen TemperatureSensor mit dem Standort und der Anfangstemperatur
// TODO: Geben Sie den Sensorstandort und die ersten Temperaturmesswerte aus
// Format: "Sensor: {Location}"
// Format: "Temperature: {Temperature}C ({TemperatureFahrenheit}F)"
// TODO: Aktualisieren Sie die Temperatur des Sensors mit dem aktualisierten Wert
// TODO: Geben Sie die aktualisierten Temperaturmesswerte aus
// Format: "Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)"
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjektinitialisiererWiederholung – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbungs-(:)-SyntaxDas „base“-Schlüsselwort„virtual“- und „override“-SchlüsselwörterVersiegelte KlassenDie „object“-BasisklasseWiederholung – Mitarbeiterhierarchie7Erweiterte Funktionen
Überladen von OperatorenIndexer (this[])ToString()-ÜberschreibungErweiterungsmethodenRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterThread-sicheres SingletonFactory-MusterObserver-Muster (Events)Strategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformKomponente für SpielfigurenFahrzeugvermietungsdienst2Eigenschaften & statische Member
Automatisch implementierte EigenschaftenNur lesbare/schreibbare EigenschaftenStatische Felder & MethodenStatische KlassenMember mit Ausdruckskörpern5Polymorphie & Interfaces
Compile- vs. Laufzeit-PolymorphieInterface vs. abstrakte KlasseMehrere InterfacesExplizite InterfacesUpcasting & DowncastingWiederholung – Formenrechner3Klassenarchitektur
Instanz- vs. statische DatenSchlüsselwörter 'readonly' & 'const'Backing FieldsRückblick – Bankkontenverwaltung6Kapselung
ZugriffsmodifikatorenEigenschaften zur KapselungImplementierung der DatenkapselungMuster für UnveränderlichkeitRückblick – SchülerdatenÜbe selbstständig: Online-C#-Compiler