Свойства только для чтения и записи
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 11 из 70.
Иногда вам нужны свойства, которые можно только читать или только записывать. Вы можете управлять этим, используя private для отдельных аксессоров.
Свойство только для чтения имеет публичный геттер, но приватный сеттер (или не имеет сеттера вовсе):
public class User
{
public string Username { get; private set; }
public User(string username)
{
Username = username;
}
}Внешний код может считывать Username, но только сам класс может его изменять. Это полезно для значений, которые должны быть установлены один раз во время создания.
Свойство, доступное только для записи, имеет публичный сеттер, но приватный геттер:
public class Account
{
public string Password { private get; set; }
public bool ValidatePassword(string input)
{
return input == Password;
}
}Свойства только для записи встречаются редко, но они полезны для конфиденциальных данных, таких как пароли, когда нужно принять входные данные, не раскрывая сохраненное значение.
Вы также можете создавать свойства, доступные только для чтения, используя только геттер:
public class Circle
{
public double Radius { get; }
public double Area => Math.PI * Radius * Radius;
public Circle(double radius)
{
Radius = radius;
}
}Свойства только с get; могут быть присвоены только в конструкторе или при объявлении, что делает их неизменяемыми после создания объекта.
Задание
ЛегкоДавайте создадим защищенную систему конфигурации, которая демонстрирует, когда использовать свойства только для чтения и только для записи для защиты конфиденциальных данных.
Вы создадите два файла для организации вашего кода:
Config.cs: Определите классServerConfigв пространстве именSettings, который управляет конфигурацией сервера. Он должен иметь:- Свойство только для чтения
ServerName(может быть установлено только в конструкторе) - Свойство только для чтения
Portс приватным сеттером (устанавливается через конструктор) - Свойство только для записи
ApiKey, которое хранит секретный ключ внутри - Метод
ValidateApiKey(string key), который возвращаетtrue, если предоставленный ключ совпадает с сохраненным - Конструктор, принимающий имя сервера и порт
- Свойство только для чтения
Program.cs: В основном файле создайте объектServerConfig, используя входные значения, установите API-ключ, а затем проверьте его на соответствие тестовому ключу.
Вы получите четыре входных значения:
- Имя сервера
- Номер порта
- API-ключ для хранения
- API-ключ для проверки
Выведите сведения о сервере и результат проверки в следующем формате:
Server: {ServerName}, Port: {Port}
API Key Valid: {True/False}Например, если входные данные — MainServer, 8080, secret123 и secret123, вывод должен быть следующим:
Server: MainServer, Port: 8080
API Key Valid: TrueШпаргалка
Вы можете управлять доступом к свойствам, используя private для отдельных аксессоров.
Свойство только для чтения с приватным сеттером:
public class User
{
public string Username { get; private set; }
public User(string username)
{
Username = username;
}
}Внешний код может читать Username, но только сам класс может его изменять.
Свойство только для записи с приватным геттером:
public class Account
{
public string Password { private get; set; }
public bool ValidatePassword(string input)
{
return input == Password;
}
}Полезно для конфиденциальных данных, когда вы хотите принимать входные данные, не раскрывая сохраненное значение.
По-настоящему свойство только для чтения только с геттером:
public class Circle
{
public double Radius { get; }
public Circle(double radius)
{
Radius = radius;
}
}Свойства только с get; могут быть присвоены только в конструкторе или при объявлении, что делает их неизменяемыми после создания объекта.
Попробуйте сами
using System;
using Settings;
class Program
{
public static void Main(string[] args)
{
// Чтение входных данных
string serverName = Console.ReadLine();
int port = Convert.ToInt32(Console.ReadLine());
string apiKeyToStore = Console.ReadLine();
string apiKeyToValidate = Console.ReadLine();
// TODO: Создайте объект ServerConfig с serverName и port
// TODO: Установите API ключ, используя свойство write-only
// TODO: Проверьте API ключ и выведите результаты
// Формат: Server: {ServerName}, Port: {Port}
// API Key Valid: {True/False}
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов