Публичные и внутренние члены во внутреннем классе?
ок, так что это может быть немного глупый вопрос, и есть, конечно, очевидный ответ, но мне было интересно, если я упустил какие-то тонкости.
есть ли разница в плане видимости / удобства использования между a public - члены, объявленные в internal класс а internal - члены, объявленные в internal класса?
т. е. между
internal class Foo
{
public void Bar()
{
}
}
и
internal class Foo
{
internal void Bar()
{
}
}
если вы объявили метод как public и virtual, а затем переопределил его в производном классе, который является public, причина использования этого модификатора ясна. Однако, это единственная ситуация... я упускаю что-то еще?
5 ответов:
рассмотрим такой случай:
public interface IBar { void Bar(); } internal class C : IBar { public void Bar() { } }здесь C. Bar не может быть помечен как внутренний; это ошибка, потому что C. Bar может быть доступен вызывающим D. GetBar ():
public class D { public static IBar GetBar() { return new C(); } }
A
publicчлен все еще простоinternal, когда вinternalкласса.доступность элемента никогда не может быть больше, чем доступность его содержащего типа. Например, открытый метод, объявленный во внутреннем типе, имеет только внутреннюю доступность
подумайте об этом таким образом, я хотел бы получить доступ к
publicсобственность на....? Класс, который я не вижу? :)ответ Эрика очень важно в этом случае, если он открыт через интерфейс, а не напрямую тут сделать разницу, просто зависит, если вы находитесь в этой ситуации с членом вы имеете дело с.
publicчленыinternalкласс может переопределитьpublicчленыpublicбазовые классы и, следовательно, быть немного более открытыми... если косвенно.
Если дело доходит до размышлений, имеет значение, является ли член публичным или нет:
например, вы даже можете передать вложенный частный класс В привязку WPF, и привязка будет работать против общедоступных свойств так же, как обычно.
просто столкнулся с другим примером, где есть и разница между этими двумя, при использовании из XAML в WPF.
XAML:
<Button Tag="{x:Static vm:Foo+Bar.e1}" />код
internalперечисление успешно компилируется:internal class Foo { internal enum Bar { e1, e2, } }, но неожиданно изменив его на
publicприводит к ошибке:internal class Foo { public enum Bar { e1, e2, } }последний пример выдает ошибку компиляции:
ошибка MC3064: в разметке могут использоваться только открытые или внутренние классы. 'Bar' тип не является публичным или внутренним.
к сожалению, я не могу объяснить, что случилось с
publicв этом случае. Я предполагаю, что "просто потому, что WPF работает таким образом". Просто измените модификатор вложенного класса наinternalчтобы избавиться от ошибки.