2009-05-20 6 views
4

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

+0

Возможный дубликат [В чем разница между Public, Private, Protected и Nothing?] (Http://stackoverflow.com/questions/614818/what-is-the-difference-between-public-private-protected -and-nothing) – cdeszaq

ответ

7

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() { } 
} 
+0

Думаете, вы, возможно, пропустили «внутреннее» объяснение .... – Kev

+4

Действительно. Он защищен ИЛИ внутренним, вопреки тому, как он выглядит в первую очередь +1 –

10

частный

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

защищаемого

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

внутренний

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

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

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

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

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

+0

+1 Это хороший способ подумать об этом. –

2

Как обычно, от одного из Fabulous Eric Lippert's blog posts:

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

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

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

1

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

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

Country B: еще разные сборки

X (базовый класс) является отцом Y (В Класс Herited) В стране А

Z (Inherited Класс X) является еще сын X в стране В.

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

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

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

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

спасибо.

 Смежные вопросы

  • Нет связанных вопросов^_^