Właściwości tylko do odczytu i zapisu
Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 11 z 70.
Czasami potrzebujesz właściwości, które można tylko odczytywać lub tylko zapisywać. Możesz to kontrolować, używając private przy poszczególnych akcesorach.
Właściwość tylko do odczytu ma publiczny akcesor odczytu, ale prywatny akcesor zapisu (lub nie ma go wcale):
public class User
{
public string Username { get; private set; }
public User(string username)
{
Username = username;
}
}Zewnętrzny kod może odczytać Username, ale tylko sama klasa może go zmodyfikować. Jest to przydatne w przypadku wartości, które powinny być ustawiane raz podczas tworzenia obiektu.
Właściwość tylko do zapisu ma publiczny setter, ale prywatny getter:
public class Account
{
public string Password { private get; set; }
public bool ValidatePassword(string input)
{
return input == Password;
}
}Właściwości tylko do zapisu są rzadkie, ale przydatne w przypadku wrażliwych danych, takich jak hasła, gdy chcesz przyjmować dane wejściowe bez ujawniania przechowywanej wartości.
Możesz też utworzyć właściwości tylko do odczytu, zawierające wyłącznie getter:
public class Circle
{
public double Radius { get; }
public double Area => Math.PI * Radius * Radius;
public Circle(double radius)
{
Radius = radius;
}
}Właściwości zawierające tylko get; można przypisać wyłącznie w konstruktorze lub podczas deklaracji, dzięki czemu po utworzeniu obiektu stają się niezmienne.
Wyzwanie
ŁatwyZbudujmy bezpieczny system konfiguracji, który pokazuje, kiedy używać właściwości tylko do odczytu i tylko do zapisu, aby chronić poufne dane.
Utworzysz dwa pliki, aby uporządkować swój kod:
Config.cs: Zdefiniuj klasęServerConfigw przestrzeni nazwSettings, która zarządza konfiguracją serwera. Powinna zawierać:- Właściwość tylko do odczytu
ServerName(można ją ustawić tylko w konstruktorze) - Właściwość tylko do odczytu
Portz prywatnym seterem (ustawianą za pomocą konstruktora) - Właściwość tylko do zapisu
ApiKey, która przechowuje klucz tajny wewnętrznie - Metodę
ValidateApiKey(string key), która zwracatrue, jeśli podany klucz pasuje do zapisanego klucza - Konstruktor, który przyjmuje nazwę serwera i port
- Właściwość tylko do odczytu
Program.cs: W głównym pliku utwórz obiektServerConfigna podstawie wartości wejściowych, ustaw klucz API, a następnie sprawdź go za pomocą klucza testowego.
Otrzymasz cztery dane wejściowe:
- Nazwę serwera
- Numer portu
- Klucz API do zapisania
- Klucz API do sprawdzenia
Wyświetl szczegóły serwera i wynik sprawdzenia w tym formacie:
Server: {ServerName}, Port: {Port}
API Key Valid: {True/False}Na przykład, jeśli danymi wejściowymi są MainServer, 8080, secret123 i secret123, wynik powinien wyglądać następująco:
Server: MainServer, Port: 8080
API Key Valid: TrueSpróbuj swoich sił
using System;
using Settings;
class Program
{
public static void Main(string[] args)
{
// Odczytaj dane wejściowe
string serverName = Console.ReadLine();
int port = Convert.ToInt32(Console.ReadLine());
string apiKeyToStore = Console.ReadLine();
string apiKeyToValidate = Console.ReadLine();
// TODO: Utwórz obiekt ServerConfig z serverName i port
// TODO: Ustaw klucz API za pomocą właściwości tylko do zapisu
// TODO: Sprawdź poprawność klucza API i wyświetl wyniki
// Format: Serwer: {ServerName}, Port: {Port}
// API Key Valid: {True/False}
}
}
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