В чем разница между "защищенными" и "защищенными внутренними" модификаторами в .NET?

В чем разница между защищенными и защищенными внутренними модификаторами в .NET?

4
20 мая '09 в 19:53
источник поделиться
4 ответов

частный

Доступ разрешен только в определенном типе

защищенный

закрытый доступ расширяется, чтобы включить наследующие типы

внутренний

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

И поэтому следует, что:

защищенный внутренний

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

В принципе, сначала подумайте обо всем, как private, и о чем-нибудь еще, что вы видите как расширяющееся на этом.

10
20 мая '09 в 20:14
источник

protected

Члены видны только для наследуемых типов.

protected internal

Члены видны только для типов наследования, а также для всех типов, которые также содержатся в той же сборке, что и тип объявления.

Вот пример С#:

class Program
{
    static void Main()
    {
        Foo foo = new Foo();

        // Notice I can call this method here because
        // the Foo type is within the same assembly
        // and the method is marked as "protected internal".
        foo.ProtectedInternalMethod();

        // The line below does not compile because
        // I cannot access a "protected" method.
        foo.ProtectedMethod();
    }
}

class Foo
{
    // This method is only visible to any type 
    // that inherits from "Foo"
    protected void ProtectedMethod() { }

    // This method is visible to any type that inherits
    // from "Foo" as well as all other types compiled in
    // this assembly (notably "Program" above).
    protected internal void ProtectedInternalMethod() { }
}
7
20 мая '09 в 19:55
источник

Как обычно, из одного из Сообщения Fabulous Eric Lippert:

Многие считают, что [ protected internal] означает, что "M доступен для всех производных классов, которые находятся в этой сборке". Это не. На самом деле это означает, что "M доступно для всех производных классов и для всех классов в этой сборке". То есть, это менее ограничительная комбинация, а не более ограничительная комбинация.

Это противоречит большинству людей. Я пытался понять, почему, и я думаю, что у меня это есть. Я думаю, что люди понимают internal, protected и private как ограничения из "естественного" состояния public. С этой моделью protected internal означает "применять как защищенное ограничение, так и внутреннее ограничение".

Это неправильный способ подумать об этом. Скорее, internal, protected и public являются ослаблениями "естественного" состояния private. private - значение по умолчанию в С#; если вы хотите сделать что-то более доступным, вы должны это сказать. С этой моделью становится ясно, что protected internal является более слабым ограничением, чем один.

2
20 мая '09 в 23:32
источник

для разницы между protected и protected internal lemme дайте краткий пример, и я буду соответствовать примеру...

Country A: одна сборка

Country B: другая другая сборка

X (базовый класс) является парой Y (унаследованный класс) в стране A

Z (Унаследованный класс X) является еще одним сыном X в стране B.

X обладает свойством.

  • если X упоминает свойство как protected, тогда      X говорит: все мои сыновья Y и Z, только вы оба можете получить доступ к моей собственности, где бы вы не остались... бог благословит вас. Никто не может получить доступ к моей собственности, кроме вас.

  • если X упоминает свойство как protected internal, тогда      X говорит: Все люди в моей стране A, включая моего сына Y, могут получить доступ к моей собственности. дорогой сын Z, вы можете получить доступ к моей собственности в Country B.

надеюсь, что вы, ребята, поняли...

Благодарю вас.

1
04 нояб. '10 в 19:23
источник

Посмотрите другие вопросы по меткам или Задайте вопрос