Каковы модификаторы доступа по умолчанию в C #? - PullRequest
332 голосов
/ 26 марта 2010

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

Ответы [ 9 ]

428 голосов
/ 26 марта 2010

Доступ по умолчанию для всего в 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):

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

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

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

138 голосов
/ 26 марта 2010
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!
118 голосов
/ 04 июля 2010

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

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

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

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

interface            | internal  | public, internal

class                | internal  | public, internal

struct               | internal  | public, internal

delegate             | internal  | public, internal

Вложенный Тип и членский доступ

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

interface            | public    | none

class                | private   | All¹

struct               | private   | public, internal, private²

delegate             | private   | All¹

constructor          | private   | All¹

interface member     | public    | none (always implicitly public)

method               | private   | All¹

field                | private   | All¹

user-defined operator| none      | public (must be declared public)

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

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

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

Примечание: CIL также имеет положение для защищенного и внутреннего (в отличие от существующего защищенного "или" внутреннего), но, насколько мне известно, в настоящее время оно недоступно для использования в 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 ...)

11 голосов
/ 26 марта 2010

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

Класс и структура Доступность
Внутренний по умолчанию, если нет доступа указан модификатор.

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

Доступность члена может никогда не быть больше, чем доступность содержащего его типа

Определяемые пользователем операторы всегда должны быть объявлен публичным. Для большего информация, см оператор (C # Reference).

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

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

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

По умолчанию делегаты имеют внутренний доступ.

3 голосов
/ 15 октября 2018

Класс Внутренний по умолчанию.

  • Члены класса по умолчанию private .

Интерфейс Внутренний по умолчанию.

  • Члены интерфейса по умолчанию public . (Интерфейсы не позволяют нам указать любой вид доступности для его членов.)

    Примечание: Если вы попытаетесь указать какой-либо спецификатор доступа для членов интерфейса, то это показывает ошибку компиляции.

По умолчанию это Внутренняя .

  • Членами структуры по умолчанию являются private .
3 голосов
/ 11 октября 2018

Самый простой ответ следующий .....

Все члены в C # всегда используют по меньшей мере доступный модификатор, возможный по умолчанию.

Именно поэтому все классы верхнего уровня в сборке по умолчанию являются «внутренними», что означает, что они являются общедоступными для сборки, в которой они находятся, но являются закрытыми или исключены из доступа к внешним сборкам. Единственный другой вариант для класса верхнего уровня - публичный, который более доступен. Для вложенных типов все это закрыто, за исключением нескольких редких исключений, таких как члены перечислений и интерфейсов, которые могут быть только публичными. Некоторые примеры. В случае классов и интерфейсов верхнего уровня значения по умолчанию:

класс Animal такой же как внутренний класс Animal

интерфейс Animal такой же, как открытый интерфейс Animal

В случае вложенных классов и интерфейсов (внутри типов) значения по умолчанию:

класс животных такой же, как частный класс животных

интерфейс Animal такой же как приватный интерфейс Animal

Если вы просто предполагаете, что значение по умолчанию всегда является самым закрытым, вам не нужно использовать средства доступа, пока вам не нужно изменить значение по умолчанию. Легко.

3 голосов
/ 01 октября 2016

Я хотел бы добавить ссылку на документацию. Проверьте более подробно здесь .

enter image description here

1 голос
/ 14 мая 2010

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

0 голосов
/ 26 марта 2010

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

Тип уровня: private

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...