Модификаторы доступа (Справочник по C#)
Модификаторы доступа — это ключевые слова, которые задают объявленный уровень доступности члена или типа. В этом разделе рассматриваются пять модификаторов доступа:
С помощью модификаторов доступа можно указать следующие семь уровней доступности:
- public : доступ не ограничен.
- protected : доступ ограничен содержащим классом или типами, которые являются производными от содержащего класса.
- internal : доступ ограничен текущей сборкой.
- protected internal : Доступ ограничен текущей сборкой или типами, которые являются производными от содержащего класса.
- private : доступ ограничен содержащим типом.
- private protected : Доступ ограничен содержащим классом или типами, которые являются производными от содержащего класса в текущей сборке.
- file : объявленный тип отображается только в текущем исходном файле. Типы с областью действия файла обычно используются для генераторов исходного кода.
В этом разделе также рассматриваются следующие понятия:
- Уровни доступности: с помощью четырех модификаторов доступа можно объявить шесть уровней доступности.
- Домен доступности: определяет, в каких разделах программы может присутствовать ссылка на этот член.
- Ограничения на использование уровней доступности: общие сведения об ограничениях на использование объявленных уровней доступности.
См. также
- Добавление модификаторов специальных возможностей (правило стиля IDE0040)
- Справочник по C#
- Руководство по программированию на C#
- Ключевые слова в C#
- Модификаторы доступа
- Ключевые слова доступа
- Модификаторы
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Модификаторы доступа (Руководство по программированию в C#)
Все типы и члены типов имеют уровень доступности. Он определяет возможность их использования из другого кода в вашей или в других сборках. Сборка — это DLL или EXE-файл, созданный путем компиляции одного или нескольких CS-файлов в одной компиляции. Следующие модификаторы доступа позволяют указать доступность типа или члена при объявлении:
- public: тип или член можно получить к любому другому коду в той же сборке или другой сборке, которая ссылается на нее. Уровень доступности общедоступных элементов типа определяется уровнем доступности самого типа.
- private: тип или член можно получить только по коду в том же class или struct .
- защищенный: к типу или члену можно обращаться только по коду в том же class коде или в class производном от него class .
- internal: тип или член можно получить к любому коду в одной сборке, но не из другой сборки. Другими словами, internal доступ к типам или элементам можно получить из кода, который является частью той же компиляции.
- защищенный внутренний: к типу или члену можно получить доступ к любому коду в сборке, в которой она объявлена, или из производной class в другой сборке.
- private protected: доступ к типу или элементу возможен из типов, производных от объекта class и объявляемых в сборке, содержащей этот объект.
Сводная таблица
| Расположение вызывающего объекта | public | protected internal | protected | internal | private protected | private |
|---|---|---|---|---|---|---|
| В классе | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Производный класс (та же сборка) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| Непроизводный класс (та же сборка) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ❌ |
| Производный класс (другая сборка) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| Непроизводный класс (другая сборка) | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ |
В следующих примерах показано, как изменить модификаторы доступа для типа или члена типа:
public class Bicycle < public void Pedal() < >>
Не все модификаторы доступа подходят для всех типов или членов во всех контекстах. В некоторых случаях доступность члена типа ограничивается доступностью содержащего его типа.
Доступность классов, записей и структур
Классы, записи и структуры, объявленные непосредственно в пространстве имен (другими словами, не вложенные в другие классы или структуры), могут быть public или internal . Если модификатор доступа не указан, по умолчанию используется internal .
Члены структуры, включая вложенные классы и структуры, могут быть объявлены как public , internal или private . Члены класса, включая вложенные классы и структуры, могут быть public , protected internal , protected , internal , private protected или private . Члены класса и структуры, включая вложенные классы и структуры, по умолчанию имеют доступ private . Закрытые вложенные типы недоступны за пределами типа, в котором содержатся.
Производные классы записи не могут быть более доступными, чем соответствующие базовые типы. Невозможно объявить открытый класс B , производный от внутреннего класса A . Если бы это было возможно, класс A стал бы открытым, так как все члены protected или internal класса A были бы доступны из производного класса.
Доступ к внутренним типам можно предоставить некоторым другим сборкам с помощью InternalsVisibleToAttribute . Дополнительные сведения см. в разделе Дружественные сборки.
Доступность членов классов, записей и структур
Члены классов и записей (включая вложенные классы, записи и структуры) можно объявлять с любым из шести типов доступа. Члены структуры не могут быть объявлены как protected , protected internal или private protected , так как структуры не поддерживают наследование.
Как правило, уровень доступности члена не может быть выше уровня доступности типа, в который он входит. При этом член public внутреннего класса может быть доступен за пределами сборки, если он реализует методы интерфейса или переопределяет виртуальные методы, определенные в открытом базовом классе.
Тип любого поля, свойства или события члена должен иметь по меньшей мере такой же уровень доступности, как у самого члена. Точно так же тип возвращаемого значения и типы параметров любого метода, индексатора или делегата должен иметь по меньшей мере такой же уровень доступности, как у самого члена. Например, невозможно иметь метод public M , возвращающий класс C , если только C также не является public . Аналогичным образом, невозможно иметь свойство protected типа A , если A объявлен как private .
Пользовательские операторы всегда должны объявляться как public и static . Для получения дополнительной информации см. раздел Перегрузка операторов.
Методы завершения не могут иметь модификаторы доступа.
Чтобы настроить уровень доступа для члена class , record или 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 или internal . Как и в случае с классами и структурами, для интерфейсов по умолчанию задается доступ internal . Члены интерфейса по умолчанию являются public , так как интерфейс как раз и создан для того, чтобы обеспечить другим типам доступ к классу или структуре. Объявления членов интерфейса могут включать любой модификатор доступа. Это удобнее всего использовать для статических методов, чтобы предоставить общие реализации, необходимые всем объектам, реализующим класс.
Члены перечисления всегда являются public , и модификаторы доступа к ним не применяются.
Делегаты ведут себя как классы и структуры. По умолчанию они имеют доступ internal , если объявляются непосредственно в пространстве имен, и доступ private , если являются вложенными.
Сводная таблица доступа по умолчанию
| Тип | Доступ по умолчанию |
|---|---|
| class | internal |
| struct | internal |
| interface | internal |
| record | internal |
| enum | internal |
| interface Членов | public |
| члены класса, записи и структуры | private |
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
См. также
- Укажите порядок модификаторов (правило стиля IDE0036)
- Руководство по программированию на C#
- Система типов C#
- Интерфейсы
- Уровни доступности
- private
- public
- internal
- protected
- protected internal
- private protected
- sealed
- class
- struct
- interface
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Модификаторы доступа
Классы, объекты, интерфейсы, конструкторы, функции, свойства и их сеттеры могут иметь модификаторы доступа. Геттеры всегда имеют тут же видимость, что и свойства, к которым они относятся.
В Kotlin предусмотрено четыре модификатора доступа: private , protected , internal и public . Если явно не использовать никакого модификатора, то по умолчанию применяется public .
На этой странице вы узнаете, как использовать модификаторы для всех областей видимости.
Пакеты
Функции, свойства, классы, объекты и интерфейсы могут быть объявлены на самом «высоком уровне» прямо внутри пакета.
// имя файла: example.kt package foo fun baz() < /*. */ >class Bar < /*. */ >
- Если модификатор доступа не указан, будет использован public . Это значит, что весь код данного объявления будет виден из космоса;
- Если вы пометите объявление словом private , оно будет иметь видимость только внутри файла, где было объявлено;
- Если вы используете internal , видимость будет распространяться на весь модуль;
- protected запрещено использовать в объявлениях «высокого уровня».
Чтобы использовать видимое объявление верхнего уровня из другого пакета, вы должны импортировать его.
// имя файла: example.kt package foo private fun foo() < /*. */ >// имеет видимость внутри example.kt public var bar: Int = 5 // свойство видно со дна Марианской впадины private set // сеттер видно только внутри example.kt internal val baz = 6 // имеет видимость внутри модуля
Члены класса
Для членов, объявленных в классе:
- private означает видимость только внутри этого класса (включая его члены);
- protected — то же самое, что и private + видимость в субклассах;
- internal — любой клиент внутри модуля, который видит объявленный класс, видит и его internal члены;
- public — любой клиент, который видит объявленный класс, видит его public члены.
В Kotlin внешний класс не видит private члены своих вложенных классов.
Если вы переопределите protected или internal член и явно не укажете его видимость, переопределённый элемент будет иметь тот же модификатор, что и исходный.
open class Outer < private val a = 1 protected open val b = 2 internal open val c = 3 val d = 4 // public по умолчанию protected class Nested < public val e: Int = 5 >> class Subclass : Outer() < // a не видно // b, c и d видно // класс Nested и e видно override val b = 5 // b - protected override val c = 7 // c - internal >class Unrelated(o: Outer) < // o.a и o.b не видно // o.c и o.d видно (тот же модуль) // Outer.Nested не видно, и Nested::e также не видно >
Конструкторы
Для указания видимости основного конструктора класса используется следующий синтаксис:
You need to add an explicit `constructor` keyword. —>
Вам необходимо добавить ключевое слово constructor .
class C private constructor(a: Int)
В этом примере конструктор помечен private . По умолчанию все конструкторы имеют модификатор доступа public , то есть видны везде, где виден сам класс (а вот конструктор internal класса видно только в том же модуле).
Локальные объявления
Локальные переменные, функции и классы не могут иметь модификаторов доступа.
Модули
Модификатор доступа internal означает, что этот член видно в рамках его модуля. Модуль — это набор скомпилированных вместе Kotlin файлов, например:
- модуль IntelliJ IDEA;
- Maven проект;
- исходный набор Gradle (за исключением того, что исходный набор test может получить доступ к внутренним объявлениям main );
- набор скомпилированных вместе файлов с одним способом вызова задачи в Ant.
© 2015—2023 Open Source Community
Модификатор доступа internal
Сборка является неотъемлемой частью программирования на C#. Она представляет собой один или несколько файлов, содержащих все необходимые сведения о развертывании программы и ее версии. Сборки составляют основу среды .NET. Они предоставляют механизмы для надежного взаимодействия компонентов, межъязыковой возможности взаимодействия и управления версиями. Кроме того, сборки определяют область действия программного кода.
Сборка состоит из четырех разделов. Первый раздел представляет собой манифест сборки. Манифест содержит сведения о самой сборке. К этой информации относится, в частности, имя сборки, номер ее версии, сведения о соответствии типов и параметры культурной среды (язык и региональные стандарты). Второй раздел сборки содержит метаданные типов, т.е. сведения о типах данных, используемых в программе. Среди прочих преимуществ метаданные типов способствуют межъязыковой возможности взаимодействия. Третий раздел сборки содержит программный код в формате MSIL (Microsoft Intermediate Language — промежуточный язык корпорации Microsoft). И четвертый раздел сборки содержит ресурсы, используемые программой.
Правда, при программировании на C# сборки получаются автоматически, требуя от программирующего лишь минимальных усилий. Дело в том, что исполняемый файл, создаваемый во время компиляции программы на C#, на самом деле представляет собой сборку, содержащую исполняемый код этой программы, а также другие виды информации. Таким образом, когда компилируется программа на C#, сборка получается автоматически.
Сборки являются неотъемлемой частью процесса разработки программного обеспечения в среде .NET, но формально они не относятся к средствам языка C#. Тем не менее в C# имеется одно средство, непосредственно связанное со сборкой.
Помимо модификаторов доступа public, private и protected, в C# предусмотрен также модификатор доступа internal. Этот модификатор определяет доступность члена во всех файлах сборки и его недоступность за пределами сборки. Проще говоря, о члене, обозначенном как internal, известно только в самой программе, но не за ее пределами. Модификатор доступа internal особенно полезен для создания программных компонентов.
Модификатор доступа internal можно применять к классам и их членам, а также к структурам и членам структур. Кроме того, модификатор internal разрешается использовать в объявлениях интерфейсов и перечислений.
Из модификаторов protected и internal можно составить спаренный модификатор доступа protected internal. Уровень доступа protected internal может быть задан только для членов класса. Член, объявленный как protected internal, доступен лишь в пределах собственной сборки или для производных типов.
