Общедоступные и внутренние методы во внутреннем классе

internal class Foo
{
  public void Fee()
  {
    Debug.WriteLine("Fee");
  }

  internal void Fi()
  {
    Debug.WriteLine("Fi");
  }
}

Я думаю, что Fee() и Fi() одинаково доступны, поскольку весь класс уже является внутренним. Я что-то пропускаю? Есть ли какая-либо причина выбора публичного или внутреннего для методов в таком случае?

Ответ 1

Объявление internal class Foo переопределяет доступность метода public void Fee(), эффективно делая его внутренним.

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

Ответ 2

Единственное, чего не хватает в ответе, почему вы это сделаете?

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

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

Ответ 3

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

Вы можете найти то же самое с частичным доверием к обычной .NET.

Ответ 4

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

Ответ 5

Вы правы, и Плата, и Fi будут одинаково доступны.

Из спецификации языка CSharp 3.0, под 3.5.2:

Область доступности вложенного член M, объявленный в типе T в пределах программа P определяется следующим образом (отметив, что сам М может быть тип):

• Если заявленная доступность M является общедоступной, областью доступности M является область доступности T.

Итак, даже если Fee объявлен публичным, он будет таким же доступным, как Foo (т.е. внутренний).

Ответ 6

В соответствии с msdn documentation ваш класс Foo не будет доступен за пределами вашей сборки, поэтому не имеет значения, чтобы отметить методы как внутренние, так и публичные; это даже не делает различий, используя Attribute InternalsVisibleTo

Ответ 7

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