好的,让我先从一个例子开始。这是我在另一个程序集中的基类
namespace BL
{
public class BasicClass
{
protected internal void func()
{
//Code Logic
}
}
}
现在这是我在另一个程序集中的派生类
namespace DL
{
public class DerivedClass:BasicClass
{
private void hello()
{
func();
}
}
}
我可以从基类中调用func()
,因此它显示了protected
访问修饰符属性但是internal
访问修饰符属性如何。应该允许它自其声明内部以来访问另一个程序集内的func()
。如果是这样,那么为什么称它为protected internal
而不是简单protected
答案 0 :(得分:5)
您可能想要this阅读。
受保护的内部辅助功能级别表示受保护的OR内部,而非受保护的AND内部。换句话说,可以从同一程序集中的任何类访问受保护的内部成员,包括派生类。要限制只能在同一程序集中派生类的可访问性,请将类本身声明为内部,并将其成员声明为protected。
答案 1 :(得分:4)
Internal
表示该类的成员可用于同一程序集中的所有类,但不可用于程序集外的任何类。 Protected internal
表示同一程序集中的任何类都可以访问该成员,任何其他程序集中的任何子类都可以访问。
MSDN topic on access modifiers供参考:
受保护的内部
类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在一个类声明中进行,该声明派生自声明受保护的内部元素的类,并且它必须通过派生类类型的实例进行。
答案 2 :(得分:0)
来自MSDN(点击了解更多信息):
<强>保护强>:
类型或成员只能由同一类或结构中的代码或派生类访问。
<强>内部强>:
类型或成员可以由同一程序集中的任何代码访问,但不能从其他程序集访问。
受保护的内部:
类型或成员可以由同一程序集中的任何代码访问,也可以由另一个程序集中的任何派生类访问。
答案 3 :(得分:0)
“当受保护内部的”内部“完全没有意义时,保护内部的某些东西有什么用处”:
在程序集BL,Class X中,您可以直接使用新的BasicClass()。func(),因为您设置了“internal”标志。如果未设置此标志,则类X需要从BasicClass派生才能访问func()。