Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Wir 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 eine TemperatureSensor-Klasse im Namespace Sensors. 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 -50 und 150 (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) + 32 berechnet und zurückgibt. Dabei soll das Hintergrundfeld direkt verwendet werden.
    • Einen Konstruktor, der Standort- und Anfangstemperaturwerte akzeptiert.
  • 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)"
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-C#-Compiler