Доступность в C#

Ранее модификаторы доступа уже несколько раз упоминались. При наличии опыта работы с любым другим объектно-ориентированным языком программирования вроде С++ или Java их применение может выглядеть интуитивно понятным.

Однако некото­рые нюансы доступа к членам в С# и CLI также заслуживают упоминания. Прежде чем рассматривать различные типы модификаторов, давайте немного поговорим о том, где их можно применять.

По сути, модификаторы доступа можно использовать почти с любой определенной сущностью в программе на С#, включая классы и любые члены внутри этих классов. Модификаторы доступа, применяемые к классу, касаются его видимости извне со­держащей этот класс сборки.

Модификаторы доступа, примененные к членам класса, включая методы, поля, свойства, события и индексаторы, влияют на видимость члена извне данного класса. Ниже описаны различные модификаторы доступа, имею­щиеся в С#.

Модификаторы доступа в С#

  1. public Член полностью видим как извне области определения, так и внутри этой области. Другими словами, доступ к общедоступному члену вообще не ограничен.
  2. protected Член видим только определяющему его классу и любому классу-наследнику данного класса.
  3. internal Член видим везде в пределах содержащей его сборки. Сюда входит определяющий его класс и любая область внутри сборки, но вне данного класса.
  4. protected internal Член видим внутри определяющего его класса и везде внутри сборки. Этот модификатор является комбинацией модификаторов protected и internal с использованием логической операции “ИЛИ”. Член также видим любому классу-наследнику определяющего его класса, независимо от того, находится он в той же сборке или нет.
  5. private Член видим только в определяющем классе, без исключений. Это — наиболее строгая форма доступа, и она принята по умолчанию для членов класса.

Обратите внимание, что CLR поддерживает еще одну форму доступности, которую проектировщики языка С# сочли необязательной для реализации. Внутри CLR она известна как доступность семейства и сборки. В терминологии С# это соответствует protected и internal. Если по какой-то причине вам совершенно необходим такой модификатор доступа, то следует воспользоваться другим языком, таким как C++/CLI или низкоуровневым IL.

Теперь давайте рассмотрим допустимое применение этих модификаторов к разным определенным сущностям внутри С#. Члены класса могут использовать пять вариантов модификаторов доступа С#.

Доступом по умолчанию к членам класса в отсутствие вся­ких модификаторов является private. Типы, определенные внутри или вне простран­ства имен, могут иметь только два модификатора доступа: public или internal. По умолчанию для них принято internal.

Модификаторы доступа public, private и internal можно применять к опре­делению членов struct. Обратите внимание на отсут­ствие модификаторов protected и protected internal.

Здесь они не нужны, посколь­ку struct по умолчанию герметизированы (sealed) — в том смысле, что они не могут служить базовыми классами для наследования.

На заметку! Еще одно важное замечание для тех, кто работал на С++: члены struct являются private по умолчанию — как в определении класса, тогда как в С++ они по умолчанию public.

И, наконец, члены интерфейсов, по своей природе являются public. Интерфейсы предназначены для определения набора операций, или контракта, который класс мо­жет реализовать. Для интерфейса не имеет смысла предусматривать какие-то члены с ограниченным доступом, поскольку члены с ограниченным доступом обычно ассоции­руются с реализацией класса, а интерфейсы по определению реализации не содержат.

Перечисления, с другой стороны, обычно используются в качестве именованных кол­лекций констант. Они также не имеют внутренней реализации, так что ограничение доступа для них также не имеет смысла. В действительности, вы получите сообщением об ошибке, если специфицируете модификатор доступа вроде public для члена интер­фейса или члена перечисления.

Как видите, почти всегда доступом по умолчанию является наиболее ограниченный доступ, имеющий смысл для данной сущности. Другими словами, чтобы открыть дру­гой доступ к классам или членам класса, потребуется приложить некоторые усилия.

Единственное исключение — доступ к пространству имен, принятый по умолчанию как public и не допускающий указания каких-либо модификаторов доступа.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100