Публичные и внутренние члены во внутреннем классе?
Хорошо, так что это может быть немного глупым вопросом, и, безусловно, очевидный ответ, но мне было любопытно, если я пропустил какие-то тонкости здесь.
Существует ли какая-либо разница в отношении видимости/удобства использования между членом public
, объявленным в классе internal
, и членом internal
, объявленным в классе internal
?
то есть. между
internal class Foo
{
public void Bar()
{
}
}
и
internal class Foo
{
internal void Bar()
{
}
}
Если вы объявили метод как public
, а также virtual
, а затем переопределили его в производном классе public
, причина использования этого модификатора понятна. Однако, это единственная ситуация... я пропустил что-то еще?
Ответы
Ответ 1
Рассмотрим этот случай:
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(); }
}
Ответ 2
Элемент A public
остается только internal
, когда в классе internal
.
Из MSDN:
Доступность элемента никогда не может быть больше, чем доступность его содержащего типа. Например, публичный метод, объявленный во внутреннем типе, имеет только внутреннюю доступность
Подумайте об этом так, я бы получил доступ к свойству public
на....? Класс, который я не вижу?:)
Ответ Eric очень важен в этом случае, если он отображается через интерфейс, а не напрямую, он действительно имеет значение, просто зависит, находитесь ли вы в этой ситуации с членом, с которым имеете дело.
Ответ 3
Если дело доходит до размышлений, важно, является ли член публичным или нет:
Например, вы даже можете передать вложенный закрытый класс в привязку WPF, и привязка будет работать с общедоступными свойствами так же, как обычно.
Ответ 4
Просто столкнулся с другим примером, где разница между этими двумя, когда используется из XAML в WPF.
XAML:
<Button Tag="{x:Static vm:Foo+Bar.e1}" />
Код с internal
enum успешно компилируется:
internal class Foo
{
internal enum Bar
{
e1,
e2,
}
}
Но неожиданно изменение его на public
приводит к ошибке:
internal class Foo
{
public enum Bar
{
e1,
e2,
}
}
В последнем примере возникает ошибка компиляции:
ошибка MC3064: в разметке могут использоваться только общедоступные или внутренние классы. Тип "Бар" не является общедоступным или внутренним.
К сожалению, я не могу объяснить, что случилось с public
в этом случае. Я предполагаю, что "просто потому, что WPF работает именно так". Просто измените модификатор вложенного класса на internal
, чтобы избавиться от ошибки.
Ответ 5
public
члены класса internal
могут переопределять public
членов базовых классов public
и, следовательно, быть немного более разоблаченными... если косвенно.