В чем разница между защищенными и защищенными внутренними модификаторами в .NET?В чем разница между «защищенными» и «защищенными внутренними» модификаторами в .NET?
ответ
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() { }
}
Думаете, вы, возможно, пропустили «внутреннее» объяснение .... – Kev
Действительно. Он защищен ИЛИ внутренним, вопреки тому, как он выглядит в первую очередь +1 –
частный
Доступ разрешен только внутри определенного типа
защищаемого
частный доступ расширяется, чтобы включить наследуя типы
внутренний
частный доступ расширен за счет включения других типов в той же сборке
И поэтому следует что:
защищенный внутренний
частный доступ расширяется, чтобы разрешить доступ к типам, либо наследоваться от или находятся в той же сборке, так как этот тип, или обоих.
В принципе, подумайте обо всем, как private
, и что-нибудь еще, что вы видите как расширяющееся на этом.
+1 Это хороший способ подумать об этом. –
Как обычно, от одного из Fabulous Eric Lippert's blog posts:
Многие люди считают, что [
protected internal
] означает «M доступен для всех производных классов, которые в этой сборке». Это не так. Это на самом деле означает «M доступно для всех производных классов и для всех классов в этой сборке». То есть, это менее ограничительное сочетание, а не более ограничительное сочетание.Это неинтересно для многих людей. Я пытался понять, почему, и я думаю, что у меня это есть. Я думаю, что люди задумывают
internal
,protected
иprivate
как ограничения от «естественного» состоянияpublic
. С этой модельюprotected internal
означает «применять как защищенное ограничение, так и внутреннее ограничение».Это неправильный способ подумать об этом. Скорее,
internal
,protected
иpublic
являются ослаблениями «естественного» состоянияprivate
.private
по умолчанию используется в C#; если вы хотите сделать что-то более доступным, вы должны это сказать. С этой моделью становится ясно, чтоprotected internal
является более слабым ограничением, чем в одиночку.
разницу между protected
и protected internal
Lemme дать краткий пример, и я буду соответствовать примеру ...
Country A
: одна сборки
Country B
: еще разные сборки
X
(базовый класс) является отцом Y
(В Класс Herited) В стране А
Z
(Inherited Класс X
) является еще сын X
в стране В.
X
имеет свойство.
если
X
упоминает собственность какprotected
тоX
говорит: все мои сыновьяY
иZ
, только вы оба можете получить доступ к своей собственности, где у остаться ... Бог благословит вас. Никто не может получить доступ к моей собственности, кроме вас.если
X
упоминает свойство какprotected internal
тоX
говорит: Все люди в моей странеA
включая мой сынY
, могут получить доступ к своей собственности. дорогой сынZ
, все еще вы можете получить доступ к моей недвижимости вCountry B
.
надеюсь, что вы, ребята понимали ...
спасибо.
Возможный дубликат [В чем разница между Public, Private, Protected и Nothing?] (Http://stackoverflow.com/questions/614818/what-is-the-difference-between-public-private-protected -and-nothing) – cdeszaq