Видимость по умолчанию для классов и членов C # (поля, методы и т. Д.)?

164

Я пытаюсь найти ссылку на видимость по умолчанию различных аспектов C #. Типы классов, поля, методы, перечисления и т. Д.

Может ли кто-нибудь предоставить их список вместе с видимостью по умолчанию (т.е. без префиксного модификатора)?

Райан Питерс
источник
возможный дубликат модификатора доступа
Джефф Стерн
8
Я бы не стал считать его дубликатом ... этот вопрос является специфическим (что по умолчанию для ЭТОГО?), Этот вопрос является широким (какие ВСЕ значения по умолчанию?)
WernerCD

Ответы:

266

Всю информацию, которую вы ищете, можно найти здесь и здесь (спасибо Reed Copsey ):

С первой ссылки:

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

...

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

...

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

...

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


Со второй ссылки:

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

И для вложенных типов:

Члены группы Доступность по умолчанию
---------- ----------------------------
enum public
частный класс
общедоступный интерфейс
структура частная
Одед
источник
6
Хорошая компиляция из информации Рида, но вы забыли указать, что такие модификаторы доступа применимы и к методам.
Джоэл
4
@ Джоэл Что ты имеешь в виду? Он четко заявляет «члены». Члены являются данными и поведением и, следовательно, включают методы.
Ризм
В случае, если какие-либо разработчики vb.net смотрят на это, vb отличается. Область по умолчанию для членов класса vb - Public. EnumЧлены также Public. Вероятно, менее запутанно просто использовать явную область видимости в вашем случае, поскольку высоки шансы, что она будет переведена или прочитана разработчиками c # в какой-то момент. К сожалению, генерация кода в vb.net не делает этого за вас.
toddmo
Я добавлю, что вложенный интерфейс внутри класса по умолчанию является закрытым, а не внутренним.
Фрэнк Брайс
13

Из MSDN:

Типы верхнего уровня , которые не вложены в других типах, могут только иметь internalили publicдоступность. По умолчанию доступ для этих типов internal.


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

Модификаторы доступности и вложенных элементов по умолчанию

Источник: Доступность Уровни (C #) (6 декабря - е , 2017)

Николас Миллер
источник
9

По умолчанию модификатором доступа для класса является internal. Это означает, что класс доступен в одной сборке. Но если мы хотим, чтобы к классу обращались из других сборок, он должен быть обнародован.

MRK
источник
19
Эта информация уже присутствовала в других ответах. Вы должны отвечать на вопрос, особенно старый, такой как этот, только когда у вас есть дополнительная информация или вы считаете, что другие ответы неверны. В любом случае, добро пожаловать в Stack Overflow.
Горпик
Класс не обязательно должен быть общедоступным, чтобы быть доступным для других сборок. Можно использовать класс InternalsVisibleToAttribute[assembly:InternalsVisibleTo("Friend1b")]
Адам
0

По умолчанию это private. Если они не вложенные, классы есть internal.

Svisstack
источник
1
не являются ли перечисления общедоступными по умолчанию?
Райан Питерс
4
@Jay: если они не вложенные @Ryan: Нет, не вложенные перечисления являются внутренними по умолчанию.
Джон Скит
2
@Ryan: члены Enum по умолчанию общедоступны, но само перечисление является внутренним.
Рид Копси
@ ReedCopsey Но книга, из которой я учусь, ясно говорит об этом enum members are private by default, so to use them outside the enum we should declare them as public. Не могли бы вы объяснить, почему книга противоречит тому, что вы говорите? Спасибо.
Что бы ни читала книга @ user5794376 (явно удаленная учетная запись), следует дать все 1-звездочные обзоры, если то, что они говорят в книге, верно. Достаточно взглянуть на Документы Microsoft, чтобы узнать, что члены enum по умолчанию являются открытыми, и поэтому обычные практики для перечислений - не указывать их явно.
Родни С. Фоли