Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

2. Понятие «модификатор доступа»

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

  • public ― доступ к типу или члену возможен из любого другого кода в той же сборке или другой сборке, ссылающейся на него. Открытый доступ.

  • private ― доступ к типу или члену можно получить только из кода в том же классе или структуре. Закрытый доступ.

  • protected ― доступ к типу или элементу можно получить только из кода в том же классе или структуре, либо в производном классе. Защищённый доступ.

  • internal ― доступ к типу или члену возможен из любого кода в той же сборке, но не из другой сборки. Внутренний доступ.

  • protected internal ― доступ к типу или элементу может осуществляться любым кодом в сборке, в которой он объявлен, или из наследованного класса другой сборки. Доступ из другой сборки должен осуществляться в пределах объявления класса, производного от класса, в котором объявлен защищённый внутренний элемент, и должен происходить через экземпляр типа производного класса. Защищённый внутренний доступ.

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

3. Доступность класса и структуры

Классы и структуры, объявленные непосредственно в пространстве имён (другими словами, не вложенные в другие классы или структуры) могут быть открытыми или внутренними. Если модификатор доступа не указан, по умолчанию используется внутренний тип.

Члены структуры, включая вложенные классы и структуры, могут быть объявлены как открытые, внутренние или закрытые. Члены классов, включая вложенные классы и структуры, могут быть открытыми, защищёнными внутренними, защищенными, внутренними или закрытыми. Уровень доступа для членов класса и членов структуры, включая вложенные классы и структуры, является закрытым по умолчанию. Закрытые вложенные типы недоступны за пределами содержащего типа.

Производные классы могут обладать лучшей доступностью, чем их базовые типы. Другими словами, открытый класс B, являющийся производным от внутреннего класса A, не может использоваться. Его использование может быть приравнено к переводу класса A в открытый тип, поскольку все защищённые или внутренние члены A доступны из производного класса.

При помощи InternalsVisibleToAttribute можно сделать возможным доступ других определённых сборок к внутренним типам. Дополнительные сведения можно получить разделе Дружественные сборки (C# и Visual Basic) (http://msdn.microsoft.com/ru-ru/library/0tke9fxk.aspx).

4. Доступность члена класса и структуры

Члены класса (включая вложенные классы и структуры) можно объявить с любым из пяти типов доступа. Члены структуры нельзя объявлять защищёнными, так как структуры не поддерживают наследование.

Как правило, доступность члена класса никогда не выше доступности содержащего его типа. Однако открытый член внутреннего класса может быть доступен за пределами сборки, если реализует методы интерфейса или переопределяет виртуальные методы, определённые в открытом базовом классе.

Тип любого элемента, являющегося полем (переменной), свойством или событием, должен, по меньшей мере, быть таким же доступным, как и этот элемент. Аналогичным образом тип возвращаемого значения и типы параметров любого члена, который является методом, индексатором или делегатом, должны иметь, по меньшей мере, такой же уровень доступности, как сам элемент. Например, метод M, возвращающий класс C не может быть открытым, если C также не является открытым. Подобным образом, свойство типа A не может быть защищенным, если A объявлен внутренним.

Определённые пользователям операторы (перегруженные операторы) также должны быть объявлены как открытые.

Деструкторы не могут иметь модификаторов доступности.

Чтобы задать уровень доступа для класса или элемента структуры, необходимо использовать соответствующим ключевым словом в объявлении элемента, как показано в следующем примере:

// public класс

public class Tricycle

{

// protected метод

protected void Pedal() { }

// private поле (переменная)

private int wheels = 3;

// protected internal свойство

protected internal int Wheels

{

get { return wheels; }

}

}

Защищённый внутренний уровень доступности означает «защищённый или внутренний», а не «защищённый и внутренний». Другими словами, доступ к защищённому внутреннему члену может осуществляться из любого класса в одной сборке, в том числе из производных классов. Чтобы ограничить доступность только производными классами в одной и той же сборке, сам класс необходимо объявить внутренним, а его члены ― защищёнными.