Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

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

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

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