困惑:内部,受保护和受保护的内部

时间:2012-03-10 14:06:45

标签: c# oop

  

可能重复:
  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类和A类。在类库项目testlib中,我有类C.程序类在一个单独的控制台应用程序中。在Program类的主要方法中,我为类B(objB)和类C(objC)创建了对象。对于objB和objC,只能访问A类的公共方法。我期待B级的所有方法都可以访问。请帮助我理解这一点。如果您需要有关该项目的任何其他信息,请随时向我询问。

此致 Priyank

3 个答案:

答案 0 :(得分:14)

可以使用访问修饰符指定以下五个辅助功能级别:

公开:访问不受限制。

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

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

protected internal:访问仅限于从包含类派生的当前程序集或类型。

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

Taken directly from Microsoft's MSDN library.

答案 1 :(得分:5)

internal

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

protected

仅在继承A的类中可见。

protected internal

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

答案 2 :(得分:4)

只能从声明procted方法的类派生的另一个类访问

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组合在一起,可以在该程序集中的所有类的同一程序集中使用该方法。并且受保护使得该方法可用于所有派生类,无论哪个程序集。