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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тип любого элемента, являющегося полем, свойством или событием, должен, по меньшей мере, быть таким же доступным, как и этот элемент.Аналогичным образом тип возвращаемого значения и типы параметров любого члена, который явл. методом, индексатором или делегатом, должны иметь по меньшей мере такой же уровень доступности, как сам элемент.Например, метод 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; }
    }
}
ПримечаниеПримечание

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

Другие типы

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

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

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

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

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

См. также

Ссылки

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

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

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

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

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

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

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

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

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

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

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