Инкапсуляция в C#

Инкапсуляция в C#: модификаторы доступа public, private, protected, internal — зачем скрывать данные и как это работает.

Инкапсуляция — принцип ООП, при котором внутренние детали класса скрываются от внешнего мира. Доступ к данным контролируется через специальные методы и свойства, а не напрямую.

Модификаторы доступа

Модификатор

Кто видит

public

все: другие классы, другие сборки

private

только внутри этого класса

protected

этот класс и его потомки

internal

любой класс в той же сборке (проекте)

Пример: банковский счёт

class BankAccount
{
    private decimal _balance;  // скрытый баланс

    public string Owner { get; private set; }  // читать можно, писать — только внутри

    public BankAccount(string owner, decimal initialBalance)
    {
        Owner    = owner;
        _balance = initialBalance;
    }

    public void Deposit(decimal amount)
    {
        if (amount <= 0) return;
        _balance += amount;
        Console.WriteLine($"Пополнение: {amount}. Баланс: {_balance}");
    }

    public bool Withdraw(decimal amount)
    {
        if (amount > _balance)
        {
            Console.WriteLine("Недостаточно средств");
            return false;
        }
        _balance -= amount;
        Console.WriteLine($"Снятие: {amount}. Баланс: {_balance}");
        return true;
    }

    public decimal GetBalance() => _balance;  // только чтение
}

var acc = new BankAccount("Иван", 1000);
acc.Deposit(500);
acc.Withdraw(200);
acc.Withdraw(2000);
Console.WriteLine($"Итого у {acc.Owner}: {acc.GetBalance()}");

Вывод:

Пополнение: 500. Баланс: 1500
Снятие: 200. Баланс: 1300
Недостаточно средств
Итого у Иван: 1300

Поле _balance закрыто как private: снаружи его нельзя ни прочитать, ни изменить напрямую. Все операции идут через методы Deposit и Withdraw, которые проверяют правила.

Зачем это нужно

  • Защита данных: никто снаружи не поставит баланс в отрицательное число одной строкой.
  • Контроль изменений: логика проверки собрана в одном месте.
  • Простота интерфейса: пользователь класса видит только то, что ему нужно.

Коротко

  • Инкапсуляция — сокрытие внутренних деталей; доступ через публичный интерфейс.
  • private — только внутри класса; public — открыто всем; protected — для потомков.
  • Поля принято делать private, а доступ давать через свойства или методы.
  • private set у свойства: читать можно снаружи, писать — только внутри класса.
Проверьте себя
1. Что означает модификатор private у поля?
AПоле видно во всём проекте
BПоле видно только внутри этого класса
CПоле видно в потомках
DПоле нельзя изменять
2. Что даёт запись public int Age { get; private set; }?
AAge нельзя ни читать, ни менять снаружи
BAge можно читать снаружи, но изменять — только внутри класса
CAge можно и читать, и писать снаружи
DЭто ошибка синтаксиса
3. В чём главная польза инкапсуляции?
AУскоряет работу программы
BСкрывает детали реализации и защищает данные от некорректных изменений
CПозволяет создавать несколько объектов
DУпрощает вывод на экран
Поддержать проект