Menu
Coddy logo textTech

Pola zapasowe

Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 17 z 70.

Właściwości implementowane automatycznie są wygodne, ale czasami potrzebujesz większej kontroli nad tym, jak właściwość przechowuje lub pobiera swoją wartość. Właśnie wtedy przydają się pola zapasowe. Pole zapasowe to pole prywatne, które przechowuje rzeczywiste dane właściwości.

public class Product
{
    private decimal _price;  // Pole zaplecza
    
    public decimal Price
    {
        get { return _price; }
        set { _price = value; }
    }
}

To może wyglądać na dodatkową pracę w porównaniu z właściwościami automatycznymi, ale pola zapasowe pozwalają dodać logikę. Na przykład możesz zweryfikować dane przed ich zapisaniem:

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

Teraz ceny ujemne automatycznie zmieniają się na zero. Możesz też przekształcać dane podczas odczytu lub zapisu, rejestrować zmiany lub wyzwalać inne działania.

Konwencja nazewnictwa pola zapasowego zazwyczaj wykorzystuje prefiks podkreślenia (_price) lub zapis małymi literami (price), aby odróżnić je od właściwości.

Gdy używasz właściwości automatycznych, takich jak public decimal Price { get; set; }, kompilator tak naprawdę tworzy dla Ciebie ukryte pole zapasowe. Jawne pola zapasowe zapewniają taką samą przestrzeń do przechowywania danych, a jednocześnie dają pełną kontrolę nad zachowaniem.

challenge icon

Wyzwanie

Łatwy

Stwórzmy system czujnika temperatury, który używa pól zapasowych do walidowania i przekształcania danych podczas ich zapisywania i pobierania.

Utworzysz dwa pliki, aby uporządkować swój kod:

  • TemperatureSensor.cs: Zdefiniuj klasę TemperatureSensor w przestrzeni nazw Sensors. Ten czujnik mierzy temperaturę w stopniach Celsjusza, ale musimy zadbać o to, aby odczyty mieściły się w prawidłowym zakresie. Użyj pól zapasowych, aby zaimplementować następujące elementy:
    • Właściwość Location (string) z polem zapasowym _location. Podczas ustawiania lokalizacji, jeśli wartość jest null lub pusta, zapisz zamiast niej "Unknown".
    • Właściwość Temperature (double) z polem zapasowym _temperature. Podczas ustawiania temperatury ogranicz wartość do zakresu od -50 do 150 (jeśli jest niższa niż -50, zapisz -50; jeśli jest wyższa niż 150, zapisz 150).
    • Właściwość tylko do odczytu TemperatureFahrenheit, która oblicza i zwraca temperaturę w stopniach Fahrenheita, korzystając ze wzoru: (celsius * 9 / 5) + 32. Powinna bezpośrednio korzystać z pola zapasowego.
    • Konstruktor przyjmujący lokalizację i początkową temperaturę.
  • Program.cs: W głównym pliku utwórz czujnik, używając wartości wejściowych, i wyświetl jego odczyty. Następnie zaktualizuj temperaturę, używając drugiej wartości wejściowej, i wyświetl zaktualizowane odczyty.

Otrzymasz trzy dane wejściowe:

  • Lokalizacja czujnika
  • Początkowy odczyt temperatury
  • Zaktualizowany odczyt temperatury

Wyświetl wynik w tym formacie:

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

Na przykład, jeśli dane wejściowe to Lab Room, 25 i 200, wynik powinien wyglądać następująco:

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

Zwróć uwagę, że drugi odczyt 200 zostaje ograniczony do 150, ponieważ przekracza maksymalną prawidłową temperaturę. Dzięki polom zapasowym możesz kontrolować sposób przechowywania danych!

Spróbuj swoich sił

using System;
using Sensors;

class Program
{
    public static void Main(string[] args)
    {
        // Odczytaj dane wejściowe
        string location = Console.ReadLine();
        double initialTemp = Convert.ToDouble(Console.ReadLine());
        double updatedTemp = Convert.ToDouble(Console.ReadLine());

        // TODO: Utwórz TemperatureSensor z podaną lokalizacją i temperaturą początkową

        // TODO: Wyświetl lokalizację czujnika i początkowe odczyty temperatury
        // Format: "Sensor: {Location}"
        // Format: "Temperature: {Temperature}C ({TemperatureFahrenheit}F)"

        // TODO: Zaktualizuj temperaturę czujnika, używając nowej wartości

        // TODO: Wyświetl zaktualizowane odczyty temperatury
        // Format: "Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)"
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C# online