Модификаторы доступа (Руководство по программированию в C#)
Все типы и члены типов имеют уровень доступности. Он определяет возможность их использования из другого кода в вашей или в других сборках. Сборка представляет собой .dll или .exe, созданные путем компиляции одного или нескольких .cs файлов в одной компиляции. Следующие модификаторы доступа позволяют указать доступность типа или члена при объявлении:
- public: код в любой сборке может получить доступ к этому типу или члену. Уровень специальных возможностей содержащего типа определяет уровень доступности общедоступных членов типа.
- private: только код, объявленный в том же или
class
struct
может получить доступ к этому члену. - защищенный: только код в том же
class
или в производномclass
может получить доступ к этому типу или члену. - internal: доступ к этому типу или члену может получить только код в одной сборке.
- защищенный внутренний: доступ к этому типу или члену может получить только код в той же сборке или в производном классе в другой сборке.
- private protected: только код в одной сборке и в том же классе или производном классе может получить доступ к типу или члену.
- file: доступ к типу или члену может получить только код в одном файле.
Модификатор record
типа приводит компилятору к синтезу дополнительных элементов. Модификатор record
не влияет на специальные возможности по умолчанию для либо a record class
record struct
, либо для .
Сводная таблица
Расположение вызывающего объекта | public |
protected internal |
protected |
internal |
private protected |
private |
file |
---|---|---|---|---|---|---|---|
В файле | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
В классе | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
Производный класс (та же сборка) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Непроизводный класс (та же сборка) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ❌ | ❌ |
Производный класс (другая сборка) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ | ❌ |
Непроизводный класс (другая сборка) | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
В следующих примерах показано, как изменить модификаторы доступа для типа или члена типа:
public class Bicycle
{
public void Pedal() { }
}
Не все модификаторы доступа подходят для всех типов или членов во всех контекстах. В некоторых случаях доступность содержащего типа ограничивает доступность его членов.
Несколько объявлений частичного класса или частичного члена должны иметь одинаковые специальные возможности. Если одно объявление частичного класса или члена не включает модификатор доступа, другие объявления не могут объявлять модификатор доступа. Компилятор создает ошибку, если несколько объявлений для частичного класса или метода объявляют различные специальные возможности.
Доступность классов и структур
Классы и структуры, объявленные непосредственно в пространстве имен (не вложенные в другие классы или структуры), могут иметь public
internal
или file
получить доступ. Если модификатор доступа не указан, по умолчанию используется 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
реализует методы интерфейса или переопределяет виртуальные методы, определенные в общедоступном базовом классе.
Тип любого поля, свойства или события члена должен иметь по меньшей мере такой же уровень доступности, как у самого члена. Точно так же тип возвращаемого значения и типы параметров любого метода, индексатора или делегата должен иметь по меньшей мере такой же уровень доступности, как у самого члена. Например, невозможно иметь метод public
M
, возвращающий класс 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
, и модификаторы доступа не могут быть применены.
Модификатор file
доступа допускается только в объявлениях типов верхнего уровня (не вложенных).
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.