В чем разница между «защищенными» и «защищенными внутренними» модификаторами в .NET? - PullRequest
4 голосов
/ 20 мая 2009

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

Ответы [ 4 ]

10 голосов
/ 20 мая 2009

частный

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

1010 * защищены *

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

внутренний

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

И вот из чего следует:

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

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

По сути, сначала думайте обо всем как о private, а обо всем, что вы видите, расширяя это.

7 голосов
/ 20 мая 2009

protected

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

protected internal

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

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

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() { }
}
2 голосов
/ 21 мая 2009

Как обычно, из одного из Потрясающих сообщений Эрика Липперта в блоге :

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

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

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

1 голос
/ 04 ноября 2010

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

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

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

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

Z (унаследованный класс X) - еще один сын X в стране Б.

X имеет свойство.

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

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

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

спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...