Почему C # позволяет методам / членам быть публичными, когда класс является внутренним - PullRequest
8 голосов
/ 15 февраля 2010

У меня есть класс, который я пометил как внутренний, и я отметил поля и методы как общедоступные. Он скомпилирован без ошибок и предупреждений. Есть ли какая-то конкретная необходимость иметь методы как public, так и class как внутренние (кроме случаев, когда они реализуются из интерфейсов или классов)?

Ответы [ 4 ]

8 голосов
/ 15 февраля 2010

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

В основном для участника:

  • public означает, что член виден всем, кто может видеть Тип.

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

Таким образом, ваш выбор будет основан на том, какой из них является наиболее подходящим. В целом, наиболее целесообразно сделать членов общедоступными (т.е. видимыми для любого, кто может видеть Type, т. Е. Частью общедоступного API Type). Вы сделаете члены внутренними по той же причине, по которой вы делаете члены внутренними в общедоступном классе - как правило, вспомогательные члены, которые должны быть видимы только для «дружественных» классов в одной сборке и не являются частью общедоступного API.

Кроме того, внутренний Тип может быть производным от открытого Типа, поэтому может наследовать и переопределять открытые члены. Имеет ли смысл разрешать переопределенным публичным членам, но не новым публичным членам?

5 голосов
/ 15 февраля 2010

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

внутренний (C # Reference)

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

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

Редактировать

С Область применения внутреннего метода в C #?

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

1 голос
/ 15 февраля 2010

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

0 голосов
/ 15 февраля 2010

Рассмотрим этот случай:

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

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

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