c#中受保护的vs受保护的内部(再次)

时间:2014-04-08 14:37:51

标签: c# .net protected access-modifiers

我在protected vs protected internal上再次提出一个问题,因为我仍然不确定并且无法控制它们。

非常感谢任何帮助。

// DLL 1

 namespace Assembly1
  {
    class class1 : class2
    {
      static void Main()
      {
         new class1().Test();
      }

      private void Test()
      {
         Console.WriteLine(this.sample);
      }
    }
 }

// DLL 2

 namespace Assembly2
    {
        public class class2
        {
          // protected string sample = "Test";           
             protected internal string sample = "Test";

       //Same behavior when using protected and protected internal. Why ?

    }
}

我对这两行都有相同的行为。

      // protected string sample = "Test";           
         protected internal string sample = "Test";

但我确信应该会有一些不同。

  

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

     

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

只要我从基类继承,我就可以从外部程序集中访问protectedprotected internal

非常混乱!两者看起来完全相似。任何人都可以通过修改上面的例子来解释我吗?

4 个答案:

答案 0 :(得分:13)

protected表示您可以从任何子类型(当然还有声明类型本身)访问该成员。因此,无论该子类型在哪里,即使它在另一个程序集中,您仍然可以访问所有受保护的成员。

internal表示您可以从同一程序集中的任何类型访问该成员。因此,即使是位于同一程序集中的完全不相关的类也可以访问该成员。

protected internal结合了两者,意味着两者分开申请。因此,您可以从任何子类型访问该成员,也可以从同一程序集中的任何类型访问该成员。


// Assembly 1
class A {
    protected int foo;
    internal int bar;
    protected internal int baz;
}

class B : A {} // can access: foo, bar, baz
class C {} // can access: bar, baz

// Assembly 2
class D : A {} // can access: foo, baz
class E {} // can access neither

答案 1 :(得分:9)

protected internalprotected OR internal,因此它的行为与其定义的程序集之外的行为完全相同,并且在内部行为与内部行为相同组装

有趣的是,CLR包含受保护的 AND 内部访问修饰符,它可能包含在下一版本的C#中private protected - 这限制了对程序集中子类型的访问它被定义了。

答案 2 :(得分:1)

声明为protected(但不是protected internal)的任何内容 ,可从类型为protected的类型中提供。

换句话说,第2组内的其他任何类型都无法访问sample,但class2以下的类型除外。

如果您将其声明为protected internal,则上述情况适用,即从class2下载的类型可以访问sample,但另外,其他同一个程序集中的类型可以访问它。

所以,protected

  • 来自class2的类型可以访问sample,无论在

protected internal

  • 来自class2的类型可以访问sample,无论在
  • assembly2中的其他类型也可以访问sample

答案 3 :(得分:1)

这是我提出的类比。

让我们假设 asembly1 作为国家/地区。如果国家/地区引入了新的内部'法律,那么它只适用于居住在该国的人。与交通法规一样。

如果国家/地区引入了新的受保护的'法律,则适用于居住在国内或国外的公民。像财产,所得税。

受保护的内部受保护或内部。

非常感谢/ user / poke