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

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

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

Модификатор record типа приводит компилятору к синтезу дополнительных элементов. Модификатор record не влияет на специальные возможности по умолчанию для либо a record classrecord struct, либо для .

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

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

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

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

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

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

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

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

Члены структуры, включая вложенные классы и структуры, могут быть объявлены как public, internal или private. Члены класса, включая вложенные классы и структуры, могут быть public, protected internal, protected, internal, private protected или private. Члены класса и структуры, включая вложенные классы и структуры, по умолчанию имеют доступ private.

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

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

Другие типы

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

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

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

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

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

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

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

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

Чтобы настроить уровень доступа для члена 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
    {
        get { return _wheels; }
    }
}

Методы завершения не могут иметь модификаторы доступа. Элементы типа всегда publicявляются элементамиenum, и модификаторы доступа не могут быть применены.

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

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

См. также