Модификаторы доступа - вопрос №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.