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


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

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

т. е. между

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

и

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

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

5 52

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 класса.

от MSDN:

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

подумайте об этом таким образом, я хотел бы получить доступ к 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 чтобы избавиться от ошибки.