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



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

374   7  
c#

7 ответов:

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

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

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

(Примечание что вложенные типы будут находиться под частями" члены класса "или" члены структуры " - и поэтому по умолчанию для частной видимости.)

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!

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

ответ:

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

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

1 Все = = = public, защищенная, внутренняя, закрытая, охраняемая внутренняя

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

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

Примечание: 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
(Человек, которого я люблю Microsoft URIs...)

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

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

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

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

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

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

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

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

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

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

enter image description here

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

пространства имен уровня: internal

тип уровня: private

Comments

    Ничего не найдено.