Что означает публичный член внутреннего класса?

Например:

internal class C
{
    public void M()
    {
        Console.WriteLine("foo");
    }
}

Для меня это читается как «метод, к которому может получить доступ любой, независимо от сборки, находящейся внутри класса, к которому можно получить доступ только из кода в той же сборке».

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

Итак, я полагаю, либо

  1. Что-то не хватает в моем понимании уровней защиты.
  2. Может быть предупреждение, но его нет.

(если 2, это не попытка на это пожаловаться - я просто хочу понять)


person Aaron Anodide    schedule 30.04.2012    source источник
comment
Может быть, компилятор знает, что C и M не настоящий код ...? algo: one char variable = ›Удачи, я вполне ... :)   -  person gdoron is supporting Monica    schedule 01.05.2012
comment
Почему private class C { } не разрешено, а class C { } разрешено? Иногда C# бывает жестким ради жесткости.   -  person John Alexiou    schedule 01.05.2012
comment
@ ja72: C # не является жестким ради жесткости; он жесткий, чтобы предоставить ценность разработчикам, которые предпочитают, чтобы их инструмент сообщал им об ошибках. private class C{} совершенно законен внутри типа; class C{} означает то же самое, что и private class C{} внутри типа. private class C{} не допускается вне типа, потому что private означает закрытый для этого типа, что, очевидно, бессмысленно вне типа! В C # internal class C{} можно использовать вне типа, а class C{} означает то же самое вне типа.   -  person Eric Lippert    schedule 01.05.2012
comment
@EricLippert: Что ж, для меня private также означает приватность в пространстве имен, как это подразумевается.   -  person John Alexiou    schedule 01.05.2012
comment
@ ja72, в C # не существует такой вещи, как «приватность в пространстве имен». Пространства имен нужны для организации кода, а не для того, чтобы решать, кто к чему имеет доступ.   -  person svick    schedule 01.05.2012
comment
@ ja72: svick правильный; пространства имен не являются механизмами контроля доступа. Пространства имен - это просто удобный способ организовать код; на уровне CLR не существует такого понятия, как пространство имен. пространство имен N {class C {}} - это просто причудливый способ написания класса N.C {}. Это не законный C #, но именно так его видит среда CLR.   -  person Eric Lippert    schedule 01.05.2012


Ответы (4)


См. Этот вопрос SO для получения подробного ответа о том, как он работает. .

По моему опыту, мне нравится отмечать внутренних членов как общедоступные в ожидании того времени, когда я захочу изменить область видимости класса на общедоступную. Таким образом, я могу это сделать, и все ранее отмеченные внутренние методы автоматически становятся общедоступными.

person Steve Danner    schedule 30.04.2012
comment
Да, точно. Зачем вам менять каждый модификатор доступа в вашем классе, если вы можете изменить один и добиться того же. - person Robert Harvey; 01.05.2012
comment
Я полностью понял это сейчас из этих ответов ... именно на этом перекрестке, где практичность встречается с логикой, я чаще всего путаюсь - ГОДЫ я ломал голову над этим и просто никогда не думал спрашивать здесь, предполагая, что я просто не знал о более тонком точка - person Aaron Anodide; 01.05.2012

Для меня это читается как «метод, к которому может получить доступ любой, независимо от сборки, находящейся внутри класса, к которому можно получить доступ только из кода в той же сборке».

Для меня это означает, что «домен доступности C ограничен этой сборкой; домен доступности M является неограниченным подмножеством домена доступности его контейнера, C».

«public» означает это для меня, потому что это означает то, что указано в спецификации. Я рекомендую вам прочитать часть спецификации, которая касается доменов доступности, если у вас есть вопросы или опасения по этому поводу.

person Eric Lippert    schedule 30.04.2012
comment
мой вопрос был в попытке понять, зачем вам это делать, поскольку я ясно вижу, что это возможно - вы говорите, что спецификация поможет мне понять мотивы, стоящие за этим? В любом случае, я по-прежнему стремлюсь прочитать его от корки до корки и ценю поддержку. - person Aaron Anodide; 01.05.2012
comment
Это намного, намного, намного более хорошее описание того, как public работает, чем все другие ответы, которые пытаются и не могут обернуть поведение словами. - person Joey; 03.05.2012

Ключевое слово internal будет ограничивать доступ к M() только вызовами, сделанными внутри сборки, в которой находится C.

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

Другими словами, это «задумано». Когда вы помещаете public в метод, компилятор предполагает, что вы уже знаете, что, если вы наложите дополнительные ограничения на сам класс, вы должны знать, что делаете.

person Robert Harvey    schedule 30.04.2012
comment
Он это знает, он спрашивает, почему публика внутри внутреннего не выдает ему ошибку \ предупреждение. - person gdoron is supporting Monica; 01.05.2012
comment
Потому что public просто означает, что любой может получить доступ к члену. public ничего не знает и не заботится об ограничениях, наложенных на него выше в иерархии классов, и не должен. - person Robert Harvey; 01.05.2012

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

person Tony Hopkinson    schedule 30.04.2012
comment
я почти спросил вас, что такое PIA :) - person Aaron Anodide; 01.05.2012