Ограничение доступа к членам класса является основополагающим этапом объектно-ориентированного программирования, поскольку позволяет исключить неверное использование объекта. Разрешая доступ к закрытым данным только с помощью строго определенного ряда методов, можно предупредить присваивание неверных значений этим данным, выполняя, например, проверку диапазона представления чисел. Для закрытого члена класса нельзя задать значение непосредственно в коде за пределами класса. Но в то же время можно полностью управлять тем, как и когда данные используются в объекте. Следовательно, правильно реализованный класс образует некий "черный ящик", которым можно пользоваться, но внутренний механизм его действия закрыт для вмешательства извне.
Управление доступом в языке C# организуется с помощью четырех модификаторов доступа: public, private, protected и internal.
Когда член класса обозначается спецификатором public, он становится доступным из любого другого кода в программе, включая и методы, определенные в других классах. Когда же член класса обозначается спецификатором private, он может быть доступен только другим членам этого класса. Следовательно, методы из других классов не имеют доступа к закрытому члену (private) данного класса. Eсли ни один из спецификаторов доступа не указан, член класса считается закрытым для своего класса по умолчанию. Поэтому при создании закрытых членов класса спецификатор private указывать для них необязательно.
С помощью модификатора доступа protected обеспечивается создание защищенного члена класса, доступ к которому открыт в пределах иерархии классов. А модификатор internal служит в основном для сборок.
Наследование свойств и модификаторы доступа. Доступ к компонентам производных и базовых классов.
Все члены класса, как и сам класс, имеют свой уровень доступа. Только у членов их может быть уже пять:
- public – доступ к члену возможен из любого места одной сборки, либо из другой сборки, на которую есть ссылка;
- protected – доступ к члену возможен только внутри класса, либо в классе-наследнике (при наследовании);
- internal – доступ к члену возможен только из сборки, в которой он объявлен;
- private – доступ к члену возможен только внутри класса;
- protected internal - доступ к члену возможен из одной сборки, либо из класса-наследника другой сборки.
Доступ к компонентам производных и базовых классов. Из производного класса можно получить доступ к открытым, защищенным, внутренним и защищенным внутренним членам базового класса. Хотя производный класс и наследует закрытые члены базового класса, он не может получить доступ к этим членам. Однако все эти закрытые члены все же присутствуют в производном классе и могут выполнять ту же работу, что и в самом базовом классе. Например, предположим, что защищенный метод базового класса имеет доступ к закрытому полю. Это поле должно присутствовать в производном классе для правильной работы унаследованного метода базового класса.