Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 116
- Предыдущая
- 116/642
- Следующая

В текущей главе рассматриваются только ключевые слова
public
private
internal
protected internal
protected
Использование стандартных модификаторов доступа
По умолчанию члены типов являются неявно закрытыми (
private
internal
internal
private
// Внутренний класс с закрытым стандартным конструктором.
class Radio
{
Radio(){}
}
Если вы предпочитаете явное объявление, тогда можете добавить соответствующие ключевые слова без каких-либо негативных последствий (помимо дополнительных усилий по набору):
// Внутренний класс с закрытым стандартным конструктором.
internal class Radio
{
private Radio(){}
}
Чтобы позволить другим частям программы обращаться к членам объекта, вы должны определить эти члены с ключевым словом
public
protected
Radio
public
// Открытый класс с открытым стандартным конструктором.
public class Radio
{
public Radio(){}
}
Использование модификаторов доступа и вложенных типов
Как упоминалось в табл. 5.1, модификаторы доступа
private
protected
protected internal
private protected
CarColor
SportsCar
public class SportsCar
{
// Нормально! Вложенные типы могут быть помечены как private.
private enum CarColor
{
Red, Green, Blue
}
}
Здесь допустимо применять модификатор доступа
private
SportsCar
public
internal
// Ошибка! Невложенный тип не может быть помечен как private!
public class Radio
{
public Radio(){}
}
Первый принцип объектно-ориентированного программирования: службы инкапсуляции C#
Концепция инкапсуляции вращается вокруг идеи о том, что данные класса не должны быть напрямую доступными через его экземпляр. Наоборот, данные класса определяются как закрытые. Если пользователь объекта желает изменить его состояние, тогда он должен делать это косвенно, используя открытые члены. Чтобы проиллюстрировать необходимость в службах инкапсуляции, предположим, что создано такое определение класса:
// Класс с единственным открытым полем.
class Book
{
public int numberOfPages;
}
Проблема с открытыми данными заключается в том, что сами по себе они неспособны "понять", является ли присваиваемое значение допустимым с точки зрения текущих бизнес-правил системы. Как известно, верхний предел значений для типа
int
// Хм... Ничего себе мини-новелла!
Book miniNovel = new Book();
miniNovel.numberOfPages = 30_000_000;
Хотя границы типа данных
int
На заметку! Говоря точнее, члены класса, которые представляют состояние объекта, не должны помечаться как
public
Инкапсуляция предлагает способ предохранения целостности данных состояния для объекта. Вместо определения открытых полей (которые могут легко привести к повреждению данных) необходимо выработать у себя привычку определять закрытые данные, управление которыми осуществляется опосредованно с применением одного из двух главных приемов:
- Предыдущая
- 116/642
- Следующая