Модификаторы доступа (Руководство по программированию в C#)

Обновлен: Ноябрь 2007

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

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

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

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

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

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

В следующих примерах демонстрируется указание модификаторов доступа для типа или члена.

public class Bicycle
{
    public void Pedal() { }
}

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

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

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

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

При помощи InternalsVisibleToAttribute можно сделать возможным доступ других определенных сборок к внутренним типам. Дополнительные сведения см. в разделе Дружественные сборки (руководство по программированию на C#).

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

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

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

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

Определенные пользователям операторы также должны быть объявлены как открытые. Дополнительные сведения см. в разделе operator (Справочник по C#).

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

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

// public class:
public class Tricycle
{
    // protected method:
    protected void Pedal() { }

    // private field:
    private int wheels = 3;

    // protected internal property:
    protected internal int Wheels
    {
        get { return wheels; }
    }
}
ms173121.alert_note(ru-ru,VS.90).gifПримечание.

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

Другие типы

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

Члены перечисления всегда являются открытыми, и модификаторы доступа не применяются.

По умолчанию делегаты всегда имеют внутренний доступ.

Спецификация языка C#

Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:

  • 3.5 Доступ к членам

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

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Классы и структуры (Руководство по программированию в C#)

Интерфейсы (Руководство по программированию в C#)

private (Справочник по C#)

public (справочник по C#)

internal (Справочник по C#)

protected (справочник по C#)

класс (Справочник по C#)

struct (справочник по C#)

interface (Справочник по C#)