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

now*_*ed. 3 .net c# protected access-modifiers

我正在提出一个关于protectedvs 的问题(protected internal因为我仍然不确定,并且无法控制它们).

任何帮助深表感谢.

// DLL 1

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

      private void Test()
      {
         Console.WriteLine(this.sample);
      }
    }
 }
Run Code Online (Sandbox Code Playgroud)

// 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 ?

    }
}
Run Code Online (Sandbox Code Playgroud)

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

      // protected string sample = "Test";           
         protected internal string sample = "Test";
Run Code Online (Sandbox Code Playgroud)

但我相信应该有一些区别.

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

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

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

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

pok*_*oke 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
Run Code Online (Sandbox Code Playgroud)


Mar*_*k H 9

protected internalprotected OR internal,因此它的行为与它所定义的程序集之外的行为完全相同,并且在同一程序集内部表现为内部行为.

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