在C#中受保护的访问说明符和受保护的内部有什么区别

时间:2010-08-17 07:40:42

标签: c# access-specifier

C#中的访问说明符protectedinternal protected之间有什么区别?

9 个答案:

答案 0 :(得分:10)

在程序集中可以看到

Internal

继承自定义它的类的类可以看到

Protected

Protected internal可以在从定义它的类派生的程序集OR类型中看到(包括来自其他程序集的类型)。

请参阅:http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx

从页面复制:

public              Access is not restricted.
protected           Access is limited to the containing class or types derived from the containing class.
internal            Access is limited to the current assembly.
protected internal  Access is limited to the current assembly or types derived from the containing class.
private             Access is limited to the containing type.

答案 1 :(得分:2)

protected表示只有当前类,从中派生的任何类都可以访问该成员。

internal表示当前程序集中的任何类都可以访问该成员。

protected internal实质上意味着protected internal;即,从当前类(在任何程序集中)派生的所有类都可以访问该成员,就像当前程序集中的所有类一样。这与许多开发人员所期望的相反 - protected internalprotected internal的意思相同(它没有)。

答案 2 :(得分:2)

  • internal - 同一个程序集中的任何内容都可以看到(.dll或.exe)。
  • protected - 任何子类都可以看到,无论它们在哪里。
  • internal protected - 在同一个程序集中的任何子类都可以看到,无论它们在哪里。

杰夫马特菲尔德说“内部进一步降低了这种能见度”的方式还不清楚。 internalprotected只是不同的可见性。将两者放在一起会使成员更多可见。没有显式访问修饰符的东西的默认可见性尽可能小。添加任何访问修饰符总是会增加可见性。

答案 3 :(得分:1)

internal protectedprotected internal表示外部protected(来自当前程序集之外)和内部public(来自同一程序集内)。

答案 4 :(得分:1)

受保护的内部受保护的访问说明符与继承的概念有关。

让我们举个例子来解释受保护的受保护的内部

有两个名为名称空间A 名称空间B 的名称空间。

命名空间A 中,有一个名为 classA 的类,它由一个名为 accept()的方法组成,使用 protected 访问说明符。

命名空间B 中,还有另一个名为 classB 的类,它继承自命名空间A的 classA

现在借助此受保护的说明符,我们可以访问命名空间B <的 classB 中的 accept()方法/强>

但是当使用受保护的内部访问说明符时,这个概念不正确: 如果接受() 命名空间A 的功能命名空间A 使用受保护的内部访问说明符,则 classB 名称空间B 无法访问它,因为 accept()函数只能在同一名称空间内的继承类中访问。

答案 5 :(得分:1)

-更新答案2019-

嗨,您可以通过下表找到辅助功能

enter image description here

答案 6 :(得分:0)

internal protected允许您从不是从同一对象派生的类访问同一程序集中的成员,但也允许您从另一个程序集访问成员时获得的标准受保护访问。这是内部的受保护的,而非内部的和受保护(虽然CLR允许后者,但C#不会)

答案 7 :(得分:0)

为了更好地理解受保护和受保护内部之间的区别,首先要了解受保护内部和内部之间的区别。

内部变量指的是同一个程序集。不能在不同的程序集中访问。 受保护的变量,如私有变量,但您可以在同一个程序集或不同程序集中的驱动类中访问。

 namespace InternalTest   ----This namespace in assembly One
 {
    Public class A
    {
       B ol=new B();
        Console.WriteLine(ol.x);//Output:5  
        Console.WriteLine(ol.y);//error will occured. Because protected is like Private variable
    }

    public class B
     {
        Internal int x=5;
         Protected int y=5;

      }
 }

2)采取不同的装配。

     using InternalTest;   
     namespace InternalTest1   ----This namespace in assembly Two
     {
       Public class A1:B
        {
           Public void GetInternalValue()
          {                     return x; //error can't access because this is internal

          }

          Public void GetProtectedValue()
          {
                return y;//Work because it's protected

          }
      }
       public class C
       {


       }

    }

从上面的例子中它清除你可以访问同一个程序集中的内部但不能访问不同的程序集。你可以说在同一个程序集中它看起来像是公共变量。你可以通过创建类的对象来分配值

3)受保护的内部在同一个程序集中都具有良好性,它看起来像公共变量。 在diifrent汇编中你使用像受保护的变量

答案 8 :(得分:-1)

<强>受保护的

如果该类声明为“protected”,则意味着它可以由程序集中的子类以及程序集外部的子类访问。

<强>内部

如果该类声明为“internal”,则意味着它可以被程序集中的任何类访问。

受保护的内部

如果该类被声明为“protected internal”,则意味着只能通过派生类在程序集中访问它。