Каковы модификаторы доступа по умолчанию в C#?

Каков модификатор доступа по умолчанию для классов, методов, участников, конструкторов, делегатов и интерфейсов?

351
задан Muntasir 30 October 2018 в 22:36
поделиться

6 ответов

Доступ по умолчанию для всего в C # - это «самый ограниченный доступ, который вы могли объявить для этого члена» .

Так, например:

namespace MyCompany
{
    class Outer
    {
        void Foo() {}
        class Inner {}
    }
}

эквивалентно

namespace MyCompany
{
    internal class Outer
    {
        private void Foo() {}
        private class Inner {}
    }
}

Единственное исключение из этого правила - сделать одну часть свойства (обычно установщик) более ограниченной, чем заявленная доступность самого свойства:

public string Name
{
    get { ... }
    private set { ... } // This isn't the default, have to do it explicitly
}

Это это то, что говорится в спецификации C # 3.0 (раздел 3.5.1):

В зависимости от контекста, в котором происходит объявление члена , только определенные типы объявленных {{1} } доступность разрешена. Кроме того, когда объявление члена не включает никаких модификаторов доступа, контекст, в котором происходит объявление , определяет значение по умолчанию { {1}} заявленная доступность.

  • Пространства имен неявно имеют объявленную общедоступность. Модификаторы доступа не разрешены в объявлениях пространства имен .
  • Типы, объявленные в единицах компиляции или пространствах имен, могут иметь общедоступную или внутреннюю объявленную доступность и по умолчанию внутреннюю объявленную доступность .
  • Члены класса могут иметь любой из пяти видов объявленной доступности и по умолчанию использовать объявленную частную доступность . (Обратите внимание, что тип , объявленный как член класса, может иметь любой из пяти видов объявленной доступности , тогда как тип, объявленный как член пространства имен может иметь только публичную или внутреннюю объявленную доступность.)
  • Члены структуры могут иметь публичную, внутреннюю или частную объявленную доступность и по умолчанию использовать частную {{1} }} объявлена ​​доступность, потому что структуры неявно запечатаны. Члены структуры , введенные в структуру (т. Е. Не унаследованные этой структурой), не могут иметь защищенную или защищенную внутреннюю объявленную доступность. (Обратите внимание, что тип , объявленный как член структуры , может иметь общедоступную, внутреннюю или частную доступность, тогда как тип объявлен как член пространства имен может иметь только публичную или внутреннюю объявленную доступность.)
  • Члены интерфейса неявно имеют публичную объявленную доступность. Модификаторы доступа не разрешены в объявлениях членов интерфейса .
  • Члены перечисления неявно имеют объявленную публично доступность. Модификаторы доступа не разрешены для объявлений членов перечисления .

(Обратите внимание, что вложенные типы подпадают под части «члены класса» или «члены структуры» - и поэтому по умолчанию видимость закрыта.)

450
ответ дан 23 November 2019 в 00:24
поделиться
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!
147
ответ дан 23 November 2019 в 00:24
поделиться

Уровень пространства имен: внутренний

Уровень типа: частный

0
ответ дан 23 November 2019 в 00:24
поделиться

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

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

Классы и структуры, объявленные непосредственно в пространстве имен (другими словами, не вложенные в другие классы или структуры), могут быть общедоступными или внутренними. Внутренний - это значение по умолчанию, если не указан модификатор доступа.

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

Производные классы не могут иметь большую доступность, чем их базовые типы. Другими словами, у вас не может быть общедоступного класса B, производного от внутреннего класса A. Если бы это было разрешено, это привело бы к тому, что A стал бы общедоступным, поскольку все защищенные или внутренние члены A доступны из производного класса.

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

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

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

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

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

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

Финализаторы не могут иметь модификаторы доступности.

Другие типы

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

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

Делегаты ведут себя как классы и структуры.По умолчанию у них есть внутренний доступ, если они объявлены непосредственно в пространстве имен, и частный доступ, когда они вложены.

11
ответ дан 23 November 2019 в 00:24
поделиться

Internal - модификатор по умолчанию

1
ответ дан 23 November 2019 в 00:24
поделиться

Краткий ответ: минимально возможный доступ (см. Ответ Джона Скита).

Длинный ответ:

Невложенные типы, возможности перечисления и делегирования ( могут иметь только внутреннюю или общедоступную доступность )

  | По умолчанию | Разрешенные заявленные возможности
-------------------------------------------------- ----------------
пространство имен | общественный | нет (всегда неявно публично)
перечисление | общественный | нет (всегда неявно публично)
интерфейс | внутренний | общественный, внутренний
класс | внутренний | общественный, внутренний
структура | внутренний | общественный, внутренний
делегат | внутренний | общественный, внутренний

Доступность вложенных типов и членов

  | По умолчанию | Разрешенные заявленные возможности
-------------------------------------------------- ----------------
пространство имен | общественный | нет (всегда неявно публично)
перечисление | общественный | нет (всегда неявно публично)
интерфейс | общественный | никто
класс | частный | Все¹
структура | частный | общедоступный, внутренний, частный²
делегат | частный | Все¹
конструктор | частный | Все¹
член интерфейса | общественный | нет (всегда неявно публично)
метод | частный | Все¹
поле | частный | Все¹
пользовательский оператор | нет | публичный (должен быть объявлен публичным)

¹ Все === общедоступные, защищенные, внутренние, частные, защищенные внутренние

² структуры не могут наследовать от структур или классов (хотя они могут, интерфейсы), следовательно, защищенный не является допустимым модификатором

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

Примечание: CIL также имеет положение для protected и internal (в отличие от существующих защищенных "или" internal), но, насколько мне известно, в настоящее время это недоступно для использования в C #.


См .:

http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en-us/library/cx03xt0t.aspx
(Человек, я люблю URI Microsoft ...)

124
ответ дан 23 November 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: