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

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

+343
источник поделиться
9 ответов

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

Итак, например:

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
}

Это то, что должна сказать спецификация С# 3.0 (раздел 3.5.1):

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

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

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

+439
источник
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!
+144
источник
другие ответы

Связанные вопросы


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

Короткий ответ: минимальный возможный доступ (cf Jon Skeet answer).

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

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

                     | 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)

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

Структуры

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

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

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


См:

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...)

+122
источник

Ознакомьтесь с Модификаторами доступа (Руководство по программированию в С#)

Class и Struct Accessibility

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

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

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

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

Class и Struct Member Accessibility

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

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

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

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

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

Other Types

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

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

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

+11
источник

По умолчанию класс внутренний.

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

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

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

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

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

  • Члены структуры по умолчанию являются частными.
+4
источник

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

введите описание изображения здесь

+3
источник

Самый простой ответ заключается в следующем.....

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

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

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

интерфейс Animal аналогичен общедоступному интерфейсу Animal

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

класс Animal такой же, как частный класс Animal

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

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

+3
источник

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

+1
источник

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

Тип уровня: private

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос