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

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

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

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

private - доступ к типу или члену можно получить только из кода в том же классе или структуре.

protected - доступ к типу или члену можно получить только из кода в том же классе или структуре, или в производном классе.

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

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

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

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

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

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

При помощи InternalsVisibleToAttribute можно сделать возможным доступ других определенных сборок к внутренним типам.

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

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

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

// public class:

public class Tricycle

{

// protected method:

protected void Pedal() { }

// private field:

private int m_wheels = 3;

// protected internal property:

protected internal int Wheels

{

get { return m_wheels; }

}

}

Note:

The protected internal accessibility means protected OR internal, not protected AND internal. In other words, a protected internal member is accessible from any class in the same assembly, including derived classes. To limit accessibility to only derived classes in the same assembly, declare the class itself internal, and declare its members as protected.

Other Types

Interfaces, just like classes, can be declared as public or internal types. Unlike classes, interfaces default to internal access. Interface members are always public, and no access modifiers can be applied.

Namespaces and enumeration members are always public, and no access modifiers can be applied.

By default, delegates have internal access.

Any types declared in a namespace or at the top level of a compilation unit (for example, not within a namespace, class, or struct) are internal by default, but can be made public.

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

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

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

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

------------

Примечание.

Доступность protected internal означает "защищенный OR внутренний", а не "защищенный AND внутренний". Другими словами, член protected internal доступен из любого класса в одной сборке, включая производные классы. Чтобы ограничить доступность только производными классами в одной и той же сборке, сам класс необходимо объявить внутренним, а его члены – защищенными.