4

好的,让我从一个例子开始。这是我在另一个程序集中的基类

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

4

4 回答 4

5

你可能想读一读。

受保护的内部可访问性级别意味着受保护的 OR 内部,而不是受保护的 AND 内部。换句话说,可以从同一程序集中的任何类访问受保护的内部成员,包括派生类。要限制对同一程序集中的派生类的可访问性,请将类本身声明为内部的,并将其成员声明为受保护的。

于 2013-03-14T13:24:54.930 回答
3

Internal表示该类的成员对同一程序集中的所有类均可用,但对程序集外的任何类均不可用。Protected internal表示 , 成员可以被同一程序集中的任何和任何其他程序集中的任何子类访问。

MSDN 关于访问修饰符的主题供参考:

受保护的内部

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

于 2013-03-14T13:24:42.070 回答
0

来自MSDN(单击以获取更多信息):

受保护

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

内部

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

受保护的内部

同一程序集中的任何代码或另一个程序集中的任何派生类都可以访问该类型或成员。

于 2013-03-14T13:32:17.490 回答
0

“当受保护的内部的“内部”根本没有意义时,像受保护的内部这样的东西有什么用”:

在 Assembly BL, Class X 中,您可以直接使用 new BasicClass().func(),因为您设置了“内部”标志。如果未设置此标志,则类 X 需要从 BasicClass 派生才能访问 func()。

于 2013-03-15T10:14:55.713 回答