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
Я бы пошел только с внутренними методами, если класс является внутренним. в случае, если вы передумаете и сделаете общедоступным класс, вы можете просто заменить текст, и все готово.