“受保护”和“受保护内部”有什么区别?

有人可以详细说明在C#中的“受保护的”和“受保护的内部”修饰符之间的区别吗? 看起来他们的行为方式是一样的。

“受保护的内部”访问修饰符是“受保护”和“内部”修饰符的联合。

从MSDN,访问修饰符(C#编程指南) :

保护

types或成员只能由同一类或结构中的代码或从该类派生的类访问。

内部

types或成员可以由同一个程序集中的任何代码访问,但不能从另一个程序集访问。

内部保护

types或成员可以通过声明它的程序集中的任何代码来访问, 或者可以从另一个程序集的派生类中进行访问。 来自另一个程序集的访问必须发生在派生自声明受保护内部元素的类的类声明中,并且必须通过派生类types的实例进行。

请注意protected internal意味着“ protectedinternal ”(同一个程序集中的任何类,或任何派生类 – 即使它在不同的程序集中)。

…和完整性:

私人的

types或成员只能由同一类或结构中的代码访问。

上市

types或成员可以通过相同程序集或引用它的其他程序集中的任何其他代码进行访问。

protected可以被任何组件的任何子类使用。

protected internalprotected internal的一切,加上同一个程序集中的任何东西都可以访问它。

重要的是,这并不意味着“在同一个集会中的子类” – 它是两者的结合,而不是交集。

在实践中,关于方法:

保护 – 可供inheritance的类访问,否则私有。

内部 – 公共只适用于程序集内的类,否则是私有的。

受保护的内部方法protected internal方法可以被inheritance的类程序集内的任何类访问。

受保护 :variables或方法只能用于子类(在任何程序集中)

受保护的内部 :可用于任何程序集中的子类以及同一程序集中的所有类

理解“受保护的内部”访问者的范围仍然存在很多混淆,尽pipe大多数定义已经被正确定义。 这帮助我了解了“受保护”和“受保护内部”之间的混淆:

公众内部和外部真正公开( 公共内部/公共外部

保护的内部和外部真正受到保护( 受保护的内部/受保护的外部 )(不允许在顶级课程)

私人内部和外部真正是私人的( 私人内部/私人外部 )(不允许在顶级课程)

内部在组装内部是真正公开的,但是在组装之外被排除在外像私人( 公共内部/排除外部

受保护的内部程序在程序集内部是公开的,但在程序集外部受到保护公共内部/受保护的外部 )(顶层类不允许)

正如你可以看到受保护的内部是一个非常奇怪的野兽。 不直观。

现在问题是为什么没有创build一个( 受保护的内部/排除的外部 ),或者我猜想某种“私人保护”或“内部保护”? 大声笑。 似乎不完整?

令人困惑的是,您可以在受保护,内部或私有types中嵌套公共或受保护的内部嵌套成员。 为什么你要在一个不包含外部程序集访问的内部类中访问一个嵌套的“受保护的内部”?

微软说这样的嵌套types受到它们的父types范围的限制,但这不是编译器所说的。 你可以在内部类中编译受保护的内部函数,这应该将范围限制在程序集中。

对我来说,这感觉像不完整的devise。 他们应该把所有types的范围都简化为一个明确考虑inheritance的系统,而且还要考虑嵌套types的安全性和层次结构。 这将使得对象的共享非常直观和细化,而不是基于不完整的范围系统发现types和成员的可访问性。

我已经读出了这些术语的非常明确的定义。

受保护:Access仅限于类定义以及从类inheritance的任何类。 types或成员只能由同一类或结构中的代码或从该类派生的类访问。

内部:访问仅限于当前项目组合中定义的类。 types或成员只能由同一类中的代码访问。

受保护的内部:访问仅限于当前程序集或从包含类派生的types。

受保护的成员

受保护的类的成员只能在包含的类(已经声明)中以及程序集中的派生类中以及程序集之外。

意味着如果一个驻留在程序集外部的类可以通过inheritance该类来使用另一个程序集的受保护成员。

我们可以通过inheritance这个类来暴露程序集外部的Protected成员,并只在派生类中使用它。

注意:受保护的成员不能使用派生类中的对象访问。

内部成员

一个类的内部成员是可用的,或者在程序集内创build对象或派生类,或者你可以说它可以在程序集内的所有类中访问。

注意:内部成员无法使用对象创build或在派生类中进行访问。

受保护的内部

受保护的内部访问修饰符是Protected或Internal组合。

受保护的内部成员可以在整个程序集中使用,在该程序集中声明创build对象或通过inheritance该类。 只能在派生类的外部访问。

注意:受保护的内部成员在同一个程序集中作为“内部”运行,并在“程序集”外部受保护。

public – 声明为public的成员(Functions&Variables)可以从任何地方访问。

私人 – 私人成员不能从课外访问。 这是成员的默认访问说明符,也就是说,如果您没有为成员(variables或函数)指定访问说明符,它将被视为私有。 因此,stringPhoneNumber; 相当于私人stringPhoneNumber。

受保护的 – 受保护的成员只能从子类中访问。

内部 – 只能在同一个程序集中访问。

受保护的内部 – 可以在相同的程序集以及派生类中访问。

受保护的内部最佳套件,当您想要一个成员或types在另一个程序集的派生类中同时使用时,只需要使用父类中的成员或types,而不从派生类声明。 此外,如果您只想使用一个成员或从另一个类派生的types,在同一个程序集中,您只能使用内部。