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.
Wyzwanie
ŁatwyStwó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ęTemperatureSensorw przestrzeni nazwSensors. 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-50do150(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ę.
- Właściwość
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)"
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrznePrzestrzenie nazw i dyrektywyWprowadzenie do klas i obiektówSłowo kluczowe „this”Metody i parametryPola a właściwościKonstruktoryInicjalizatory obiektówPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawowa składnia dziedziczenia (:)Słowo kluczowe 'base'Słowa kluczowe virtual i overrideKlasy sealedBazowa klasa 'object'Powtórzenie – hierarchia pracowników7Zaawansowane funkcje
Przeciążanie operatorówIndeksery (this[])Nadpisywanie ToString()Metody rozszerzającePodsumowanie – własna lista2Właściwości i składowe statyczne
Właściwości automatyczneWłaściwości tylko do odczytu i zapisuPola i metody statyczneKlasy statyczneSkładowe z ciałem wyrażeniowym5Polimorfizm i interfejsy
Polimorfizm czasu kompilacji a czasu wykonaniaInterfejs a klasa abstrakcyjnaWiele interfejsówJawne implementowanie interfejsówRzutowanie w górę i w dółPowtórka — kalkulator kształtów8Zaawansowane koncepcje OOP
Kompozycja zamiast dziedziczeniaTypy generyczne (klasy i metody)Delegaty i zdarzeniaAtrybuty i refleksjaIDisposable i instrukcja usingPodstawy wstrzykiwania zależności11Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu3Architektura klas
Dane instancji a dane statyczneSłowa kluczowe 'readonly' i 'const'Pola zapasowePowtórzenie — menedżer kont bankowych6Hermetyzacja
Modyfikatory dostępuWłaściwości w hermetyzacjiImplementacja ukrywania danychWzorce niezmiennościPowtórka — dane studentów9Argumenty zmiennej liczby
Słowo kluczowe „params”Parametry opcjonalneArgumenty nazwanePrzeciążanie metodPoćwicz samodzielnie: Kompilator C# online