internal class Foo
{
public void Fee()
{
Debug.WriteLine("Fee");
}
internal void Fi()
{
Debug.WriteLine("Fi");
}
}
Я думаю, что Fee () и Fi () одинаково доступны, поскольку весь класс уже внутренний. Я что-то не замечаю? Есть ли причина выбирать публичные или внутренние методы в таком случае?
c#
public-method
ScottS
источник
источник
Ответы:
internal class Foo
Декларация переопределяет доступностьpublic void Fee()
метода, фактически делает его внутреннее.В этом случае использование внутренних и общедоступных методов будет иметь такой же эффект. Единственная причина, по которой я выбрал бы общедоступные методы вместо внутренних в подобном случае, - это облегчить переход к общедоступному классу в будущей версии, если вы решите это сделать.
источник
Единственное, чего здесь не хватает, - это зачем вам это делать?
В некоторых библиотеках есть много классов, которые не предназначены для того, чтобы потребитель библиотеки мог их касаться, но они должны наследовать интерфейсы, отмеченные как общедоступные. Например, у меня есть библиотека с классом, который наследует интерфейс IComparer, но он используется только внутри, и я не хочу загромождать публичный аспект моей библиотеки. Если я помечу реализованную функцию сравнения как внутреннюю, компилятор пожалуется, что я не внедряю интерфейс IComparer.
Итак, как мне успешно реализовать интерфейс и в то же время предотвратить его доступность в публичном аспекте моей библиотеки? Отметьте класс как внутренний, а реализованную функцию как общедоступную.
источник
На самом деле - большая разница, если вы используете отражение; в частности, Silverlight может сильно расстроиться, если вы попытаетесь получить доступ к внутренним методам через отражение, даже если бы у вас был доступ. Я видел случаи, когда мне приходилось делать метод общедоступным, чтобы код работал в Silverlight, даже если он работает в обычном .NET.
Вы можете обнаружить то же самое при частичном доверии к обычному .NET.
источник
Это будет иметь значение, когда вы хотите, чтобы ваш внутренний класс реализовал интерфейс. Метод, который является реализацией некоторого интерфейса, должен быть Public.
источник
Вы правы, и Fee, и Fi будут одинаково доступны.
Из спецификации языка CSharp 3.0 в разделе 3.5.2:
Таким образом, даже если Fee объявлен как общедоступный, он будет таким же доступным, как и Foo (т.е. внутренний).
источник
Согласно документации msdn, ваш класс Foo не будет доступен за пределами вашей сборки, поэтому нет никакой разницы в том, чтобы пометить методы как внутренние или общедоступные; это даже не имеет значения, используя Attribute InternalsVisibleTo
источник
Я бы использовал только внутренние методы, если класс внутренний. если вы передумаете и сделаете класс общедоступным, вы можете просто заменить текст, и все готово.
источник