Публичные и Внутренние члены во Внутреннем классе? - PullRequest
56 голосов
/ 02 апреля 2010

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

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

т.е. между

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

и

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

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

Ответы [ 5 ]

52 голосов
/ 02 апреля 2010

Рассмотрим этот случай:

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(); } 
}
37 голосов
/ 02 апреля 2010

Член public все еще просто internal в классе internal.

От MSDN :

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

Подумайте об этом, я получу доступ к свойству public в ....? Класс, который я не вижу? :)

Ответ Эрика очень важен в этом случае, если он раскрывается через интерфейс, а не напрямую, он действительно имеет значение, зависит только от того, в какой ситуации вы находитесь с участником, с которым имеете дело .

2 голосов
/ 08 октября 2015

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

1 голос
/ 26 июня 2012

Если дело доходит до размышлений, имеет значение, является ли участник публичным или нет:

Например, вы даже можете передать вложенный закрытый класс в привязку WPF, и привязка будет работать с общими свойствами, как обычно.

1 голос
/ 02 апреля 2010

public члены internal класса могут переопределять public члены public базовых классов и, следовательно, быть немного более открытыми ... если косвенно.

...