Бөлісу құралы:


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

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

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

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

Модификатор record типа приводит компилятору к синтезу дополнительных элементов. Модификатор record не влияет на специальные возможности по умолчанию для либо a record classrecord 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#.

См. также