Подтвердить что ты не робот

Публичные и внутренние члены во внутреннем классе?

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

Существует ли какая-либо разница в отношении видимости/удобства использования между членом public, объявленным в классе internal, и членом internal, объявленным в классе internal?

то есть. между

internal class Foo
{
    public void Bar()
    {
    }
}

и

internal class Foo
{
    internal void Bar()
    {
    }
}

Если вы объявили метод как public, а также virtual, а затем переопределили его в производном классе public, причина использования этого модификатора понятна. Однако, это единственная ситуация... я пропустил что-то еще?

4b9b3361

Ответ 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 и, следовательно, быть немного более разоблаченными... если косвенно.