Поделиться через


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

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

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

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

Модификатор record типа заставляет компилятор синтезировать дополнительные члены. Модификатор record не влияет на доступность по умолчанию ни для record class, ни для record struct.

Сводная таблица

Расположение звонящего public protected internal protected internal private protected private
В классе ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️
Производный класс (та же сборка) ✔️ ✔️ ✔️ ✔️ ✔️
Непроизводный класс (та же сборка) ✔️ ✔️ ✔️
Производный класс (другая сборка) ✔️ ✔️ ✔️
Непроизводный класс (другая сборка) ✔️

В следующих примерах показано, как указать модификаторы доступа для типа и члена:

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

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

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

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

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

Можно объявить элементы структуры, включая вложенные классы и структуры, какpublicinternal, илиprivate. Можно объявить члены класса, включая вложенные классы и структуры, как publicprotected internal, , , protectedinternalprivate protectedили private. По умолчанию члены класса и структуры, включая вложенные классы и структуры, имеют private доступ.

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

Можно разрешить доступ к вашим внутренним типам для определенных других сборок, используя InternalsVisibleToAttribute. Дополнительные сведения см. в разделе Дружественные сборки.

Другие типы

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

Тип delegate , объявленный непосредственно в пространстве имен, имеет internal доступ по умолчанию.

Дополнительные сведения о модификаторах доступа см. на странице "Уровни специальных возможностей".

Доступность членов

Вы можете объявить члены класса class или struct (включая вложенные классы и структуры) с любым из шести типов доступа. Нельзя объявлять члены структуры как protected, protected internal или private protected, поскольку структуры не поддерживают наследование.

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

Тип любого поля, свойства или события члена должен иметь по меньшей мере такой же уровень доступности, как у самого члена. Точно так же тип возвращаемого значения и типы параметров любого метода, индексатора или делегата должен иметь по меньшей мере такой же уровень доступности, как у самого члена. Например, невозможно иметь метод publicM, возвращающий класс C, если только C также не является public. Аналогичным образом, невозможно иметь свойство protected типа A, если A объявлен как private.

Необходимо всегда объявлять определяемые пользователем операторы как public. Для получения дополнительной информации см. раздел Перегрузка операторов.

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

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

    // private field:
    private int _wheels = 3;

    // protected internal property:
    protected internal int Wheels => _wheels;
}

Финализаторы не могут иметь модификаторы доступа. Члены типа enum всегда являются public, и вы не можете применять модификаторы доступа.

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

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

См. также