Andriy Shyrokoryadov

.Net developer, data scientist

Модификаторы доступа - вопрос №4 на собеседование C# / .NET

Текст к видео "Модификаторы доступа" на канале YouTube

Одним из трёх принципов объектно-ориентированного программирования (ООП) является инкапсуляция, то есть укрытие деталей работы (т. е. имплементации) класса и предоставление конечному пользователю доступа только к определенным, важным членам класса. Возникает обоснованный вопрос – каким образом можно ограничить или, наоборот, предоставить доступ к определенным членам класса. Для решения данной задачи в языке C# предусмотрены модификаторы доступа.

Модификатор доступа — это специальная инструкция в синтаксисе языка C#, которая определяет уровень доступность конкретного члена класса или самого класса в целом для конечного пользователя нашего класса или сборки. Чтобы легче себе представить, чем является сборка (assmebly), можно сказать, что это Ваш проект в программе Visual Studio. Предусмотрены 5 модификаторов доступа:

  • public – публичный – ограничения доступа отсутствует, каждый пользователь нашего класса или сборки имеет доступ к этому классу;
  • internal – внутренний – к данному классу есть доступ только в текущей сборке; то есть если программист получил доступ к сборке (например есть доступ к файлу .dll), то у него не будет доступа к классу обозначенному модификатором доступа internal. Однако если Вы программист, который работает с конкретной сборкой, то у Вас будет доступ ко всем классам обозначенным модификатором доступа internal в рамках данной сборки.
  • protected – защищенный – члены класса обозначенные этим словом доступны в текущем классе и во всех классах которые наследуют данный класс;
  • protected internal – защищённый внутренний – члены класса обозначенные этим словом доступны в текущей сборке и в классах которые наследуют данный класс.
  • private – частный – доступ к членам класса обозначенным этим словом ограничивается только текущем классом. В классах, которые наследуют данный класс, доступа к членам private базового класса не будет – для разрешения данной ситуации необходимо использовать protected;

Если посмотреть на описание выше, то можно сделать вывод, что по степени ограничения модификаторы доступа можно выстроить следующим образом – от самого ограничивающего до наиболее свободного: private - internal - public.

При ответе на вопрос важно понимать, с какими типами данных мы можем использовать модификаторы доступа и какие значения модификаторов доступа у определенных типов данных определены по умолчанию.

  • элементы определяемые непосредственно в namespace, то есть класс, структура, интерфейс, enum могут быть public или internal. Если мы не укажем модификатор доступа перед декларацией, то тип будет считаться internal;
  • для членов класса могут использоваться всё 5 вышеуказанных модификаторов доступа;
  • для членов структуры – со структурой могут использоваться только 3 из 5 вышеперечисленных модификаторов доступа: public, internal, private. Запомнить их легко, так как в структурах нельзя использовать модификаторы protected. Давайте на секундочку остановимся и подумаем почему. Модификаторы доступа protected используются чтобы дать доступ к своим членам в классах, которые наследуют текущий класс. Но структуры нельзя наследовать. Соответственно необходимость в использовании protected отпадает. Если мы не укажем модификатор доступа перед декларацией структуры, то структура будет считаться private.