Menu
Coddy logo textTech

Свойства только для чтения и записи

Часть раздела Объектно-ориентированное программирование путешествия по 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 они становятся неизменяемыми.

challenge icon

Задание

Легко

Давайте создадим безопасную систему конфигурации, которая демонстрирует, когда следует использовать свойства только для чтения и только для записи, чтобы защитить конфиденциальные данные.

Вы создадите два файла для организации кода:

  • 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}
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C#