Инкапсуляция в C#
Инкапсуляция в C#: модификаторы доступа 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Упрощает вывод на экран