下面代码中受保护的内部访问修饰符的意义

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访问修饰符属性怎么样呢?如果声明为internal,是否应该允许在另一个程序集中访问func()?如果是这样,那么为什么称之为protected internal而不是简单的protected


1
可能是重复的问题 https://dev59.com/JnRB5IYBdhLWcg3wkH9N - शेखर
4个回答

5

您可能想要阅读这篇文章

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


1
那么,如果“protected internal”中的“internal”没有任何意义,那么像这样的东西有什么用呢? - iJade
据我所知,没有。 - Steffan Donal

3

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

可参考MSDN上有关访问修饰符的话题:

protected internal

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


那么,当“protected internal”中的“internal”毫无意义时,像这样的东西有什么用呢? - iJade
2
@iBlue,请仔细阅读,这很重要。internal 完全无法从程序集外部访问。protected internal 可以被从声明 protected internal 的类派生的类从程序集外部访问。当然,如果您的类不是公共的,则没有使用 protected internal 的必要。 - J0HN

0

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

protected

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

internal

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

protected internal

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


0
“当protected internal中的“internal”没有任何意义时,像protected internal这样的东西有什么用处呢?”
在程序集BL中,如果在Class X中设置了“internal”标志,您可以直接使用new BasicClass().func()。如果没有设置此标志,则Class X需要从BasicClass派生才能访问func()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接