混淆:内部,受保护和受保护的内部[重复]

Posted

技术标签:

【中文标题】混淆:内部,受保护和受保护的内部[重复]【英文标题】:Confusion: Internal, Protected and Protected Internal [duplicate] 【发布时间】:2012-03-27 16:06:39 【问题描述】:

可能重复:What is the difference between 'protected' and 'protected internal'?What is the difference between Public, Private, Protected, and Nothing?

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace testanotherlib

    public class A
    
        internal void InternalDisplay()
        
            Console.WriteLine("Internal Display Method.");
        

        protected void ProtectedDisplay()
        
            Console.WriteLine("Protected Display Method.");
        

        protected internal void ProtectedInternalDisplay()
        
            Console.WriteLine("ProtectedInternal Display Method.");
        

        public void PublicDisplay()
        
            Console.WriteLine("Public Display Method.");
        
    


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace testanotherlib

    public class B : A
    
    


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using testanotherlib;
namespace testlib

    public class C:A
    
    


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using testlib;
using testanotherlib;

namespace testapp

    class Program
    
        static void Main(string[] args)
        
            B objB = new B();
            C objC = new C();
        
    

我试图了解内部、受保护和受保护内部之间的区别。为此,我使用上面的代码创建了一个示例。

在类库项目 testanotherlib 中,我有 A 类和 B 类。在类库项目 testlib 中,我有 C 类。程序类位于单独的控制台应用程序中。在 Program 类的 main 方法中,我为 B 类(objB)和 C 类(objC)创建了对象。对于 objB 和 objC,只能访问类 A 的公共方法。我预计 B 类的所有方法都可以访问 A 类的所有方法。请帮助我理解这一点。如果您需要有关该项目的任何其他信息,请随时问我。

问候, 普里扬克

【问题讨论】:

您期望在哪里能够访问 A 类的所有方法,并引用 A 类?您的代码从不尝试使用成员,这使得谈论起来很困难...... @JonSkeet:如果是 A 类,我希望能够通过引用 objB 访问所有方法。 @PriyankThakkar:来自testApp为什么是你期待的? testApp 中的代码与 A 不在同一个程序集中,因此例如,任何内部成员都不可见。 微软为什么不在 MSDN 中提供 PROTECTED INTERNAL 的主题? 【参考方案1】:

protected 方法和成员只能从另一个类访问,该类派生自声明受保护方法的类。

class A 

    protected void Method() 


class B : A

    public void Foo()
    
        Method(); // works!
    


class C 

    public void Foo()
    
        Method(); // won't work, obviously

        var tmp = new A();
        tmp.Method(); // won't work either because its protected
    

internal 使该方法仅在同一程序集中可见。对于同一程序集中的类,该方法可以像公开一样使用。对于您当前程序集之外的课程,它就像私人一样。

现在结合 protected 和 internal 使得该方法可以在同一个程序集中用于该程序集中的所有类。并且受保护的方法使该方法可以在所有派生类中使用,无论是哪个程序集。

【讨论】:

您受到保护的内部错误,请参阅我的回答或 Chris'。 @SimonBangTerkildsen 哦,你是对的。我纠正了我的答案。不知道。好吧,我自己从来没有用过。因此 internal 有效地推翻了受保护的关键字。派生时忽略内部。不知道,事实上也不喜欢它:)但这一定是有充分理由的。 @dowhilefor: 谢谢你用精彩的例子解释它:) :)【参考方案2】:

可以使用访问修饰符指定以下五个可访问性级别:

public:访问不受限制。

受保护:访问仅限于包含类或从包含类派生的类型。

内部:访问仅限于当前程序集。

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

private:访问仅限于包含类型。

Taken directly from Microsoft's MSDN library.

【讨论】:

您对“受保护的内部”的定义似乎不准确,因为“或”。你确定它不应该是“和”吗? 你可能是对的。请立即通知微软!! 哦,没注意链接,懒得搜了。对不起。而且看起来仍然很合乎逻辑。【参考方案3】:

internal

仅在当前和友好的程序集中可见。

protected

仅在继承 A 的类中可见。

protected internal

在继承 A 的类中可见。并且在当前和友好的程序集中也可见。

【讨论】:

嘿西蒙..感谢您的帮助:) 受保护的内部意味着受保护的或内部的;您将其描述为受保护的和内部的。

以上是关于混淆:内部,受保护和受保护的内部[重复]的主要内容,如果未能解决你的问题,请参考以下文章

受保护的内部成员 [重复]

受保护的内部[重复]

“受保护的内部”范围的目的是啥[重复]

.Net中受保护的内部意味着啥[重复]

如何在私有和受保护的访问修饰符之间进行选择以封装基类和子类之间的成员?

面向对象编程中啥是公共的、私有的和受保护的?