C#中访问修饰符protected和internal protected有什么区别?

6
在C#中,访问修饰符protectedinternal protected有什么区别呢?

9个回答

10

Internal表示只能在程序集内部访问。

Protected表示只有继承自该类的类才能访问,包括在同一程序集内的和不在同一程序集内的。

Protected internal表示既可以在程序集内部访问,也可以被继承自它所在类的类型访问(包括其他程序集中的类型)。

参见: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.

受保护的内部有什么意义?单独使用受保护不是完全可以达到同样的效果吗? - user76071
@Vince,不,如果它是protected internal并且您从另一个程序集中派生了该类,则无法访问该方法等。但是如果只是protected,则可以访问。 - Lasse Espeholt
如果我没有访问另一个程序集中的方法,那么我可以将其标记为 internal 而不是 protected internal。我在这里漏了什么吗? :) - user76071
@Vince 嗯,是的,但这样你就可以在不从中派生的情况下访问该方法。 - Lasse Espeholt
你说过:“如果它是protected internal的,并且你从另一个程序集中派生出该类,那么你将无法访问该方法”,但是在程序集A中将方法标记为internal并从程序集B中派生该类,不也会得到相同的结果吗? - user76071

2

protected表示只有当前类和派生自它的类可以访问该成员。

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

protected internal实际上意味着protected或者internal;也就是说,所有派生自当前类(在任何程序集中)的类以及当前程序集中的所有类都可以访问该成员。这与许多开发人员的预期不同--他们认为protected internal意味着与protectedinternal相同(但实际上并不是这样)。


2
  • internal - 只能被相同程序集(.dll 或 .exe)中的任何内容看到。
  • protected - 可以被任何子类看到,无论它们在哪里。
  • internal protected - 可以被相同程序集中的任何内容和任何子类看到,无论它们在哪里。

Jeff Mattfield所说的“internal进一步降低了可见性”的方式使其不清楚。 internalprotected 仅仅是不同的可见性。同时使用这两个访问修饰符会使成员变得更加可见。没有明确访问修饰符的默认可见性尽可能小。添加任何访问修饰符都会增加可见性。


1

internal protectedprotected internal 是相同的,意思是从外部来看是 protected(在当前程序集之外),而从内部来看是 public(在同一程序集内)。


1

- 2019年更新答案 -

您可以通过以下表格找到无障碍功能。

enter image description here


1

Protected internalprotected访问修饰符与继承的概念有关。

我们通过示例来解释protectedprotected internal

有两个命名空间,分别为命名空间A命名空间B

命名空间A中,有一个名为classA的类,其中包含一个使用protected访问修饰符的方法accept()

命名空间B中,有另一个类,名为classB,它从命名空间AclassA继承而来。

现在,借助于这个protected访问修饰符,我们可以在命名空间BclassB中访问那个accept()方法。

但是,当使用protected internal访问修饰符时,这个概念就不正确了: 如果namespace AclassAaccept()函数使用protected internal访问修饰符,那么namespace BclassB将无法访问它,因为该accept()函数只能在相同命名空间内的继承类中访问。

0
为了更好地理解protected和Protected Internal之间的区别,最好先了解Protected和Internal之间的区别。
Internal变量指的是同一程序集中的变量。你无法在不同的程序集中访问它。 protected变量类似于私有变量,但你可以在同一程序集或不同程序集中的派生类中访问它。
 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
       {


       }

    }

从上面的例子清楚地可以看出,在同一程序集中可以访问内部(internal)成员,但在不同的程序集中不能。可以说,在同一程序集中它类似于公共变量。您可以通过创建类的对象来赋值。

3)protected internal 同时具有公共变量的好处。在同一程序集中,它看起来像是公共变量。在不同的程序集中使用时则像是受保护的变量。


0

internal protected 允许您从未派生自同一对象的类中访问同一程序集中的成员,但也允许您获取访问来自另一个程序集的成员所需的标准受保护访问。它是 internal | protected,而不是 internal & protected(尽管 CLR 允许后者,但 C# 不允许)。


据我理解,protected internal 没有意义,protected internal 和 protected 是一样的,允许你做完全相同的事情。 - user76071
@Vince - 它允许与protected相同的访问权限,但同时允许来自非派生类在同一程序集中进行访问(这与protected不同)。这种差异只在使用它的程序集内部才有意义,在引用该程序集的其他程序集中,对程序员来说,无论是protected还是internal protected都没有区别。 - Mark H

-1

受保护的

如果类被声明为“受保护的”,意味着它可以被子类从程序集内部以及程序集外部访问。

内部的

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

受保护的内部

如果类被声明为“受保护的内部”,意味着它只能被其派生类在程序集内部访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接