以下代码中受保护的内部访问说明符的意义

Posted

技术标签:

【中文标题】以下代码中受保护的内部访问说明符的意义【英文标题】:Significance of protected Internal access specifier in the below code 【发布时间】:2013-03-02 20:56:55 【问题描述】:

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

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

【问题讨论】:

可能重复***.com/questions/585859/… 【参考方案1】:

您可能希望阅读this。

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

【讨论】:

那么当受保护内部的“内部”根本没有意义时,像受保护的内部这样的东西有什么用 没有,据我所知。【参考方案2】:

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

MSDN topic on access modifiers供参考:

受保护的内部

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

【讨论】:

那么当受保护内部的“内部”根本没有意义时,像受保护的内部这样的东西有什么用 @iBlue,仔细阅读,意义重大。 internal 根本无法从程序集外部访问。 protected internal 可从程序集外部访问到派生自声明 protected internal 的类的类。当然,如果您的课程不是公开的 - 没有使用受保护的内部。【参考方案3】:

来自MSDN(点击查看更多信息):

受保护

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

内部

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

受保护的内部

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于以下代码中受保护的内部访问说明符的意义的主要内容,如果未能解决你的问题,请参考以下文章

c#中受保护和私有保护有啥区别? [复制]

Java中受保护的访问修饰符

C#中访问说明符保护和内部保护有啥区别

在 kotlin 中,如何从子类访问父类中受保护的静态成员

如何保护 Spring Security 中受 IP 地址限制的匿名访问?

将受保护字段限制为当前汇编 c# vb.net