Свойства только для чтения и записи
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy. Урок 11 из 70.
Иногда вам нужны свойства, которые можно только прочитать или только записать. Вы можете управлять этим, используя private для отдельных accessors.
Свойство, доступное только для чтения, имеет public getter, но private setter (или вообще не имеет setter):
public class User
{
public string Username { get; private set; }
public User(string username)
{
Username = username;
}
}Внешний код может читать Username, но изменить его может только сам класс. Это полезно для значений, которые должны быть установлены один раз во время создания.
Свойство, доступное только для записи, имеет public setter, но private getter:
public class Account
{
public string Password { private get; set; }
public bool ValidatePassword(string input)
{
return input == Password;
}
}Свойства, доступные только для записи, встречаются редко, но полезны для конфиденциальных данных, таких как пароли, когда нужно принимать input, не раскрывая stored значение.
Вы также можете создавать действительно доступные только для чтения свойства, используя только getter:
public class Circle
{
public double Radius { get; }
public double Area => Math.PI * Radius * Radius;
public Circle(double radius)
{
Radius = radius;
}
}Свойства с только get; можно присваивать только в constructor или при объявлении, поэтому после создания object они становятся неизменяемыми.
Задание
ЛегкоДавайте создадим безопасную систему конфигурации, которая демонстрирует, когда следует использовать свойства только для чтения и только для записи, чтобы защитить конфиденциальные данные.
Вы создадите два файла для организации кода:
Config.cs: определите классServerConfigв пространстве имёнSettings, который управляет конфигурацией сервера. Он должен содержать:- свойство только для чтения
ServerName(может быть установлено только в конструкторе) - свойство только для чтения
Portс закрытым setter (устанавливается через конструктор) - свойство только для записи
ApiKey, которое сохраняет секретный ключ internally - метод
ValidateApiKey(string key), который возвращаетtrue, если переданный ключ совпадает с сохранённым - конструктор, который accepts имя сервера и номер порта
- свойство только для чтения
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Попробуйте сами
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-ключ, используя свойство только для записи
// 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'Необязательные параметрыИменованные аргументыПерегрузка методовПотренируйтесь самостоятельно: Онлайн-компилятор C#