'protected'和'protected internal'有什么区别?

Emb*_*rja 235 .net c# access-modifiers

有人可以详细说明C#中'protected'和'protected internal'修饰符之间的区别吗?看起来他们的行为方式相同.

M4N*_*M4N 385

"受保护的内部"访问修饰符是工会无论是"保护"和"内部"修饰符.

MSDN,访问修饰符(C#编程指南):

受保护:

类型或成员只能由同一个类或结构中的代码访问,或者在从该类派生的类中访问.

内部:

类型或成员可以由同一程序集中的任何代码访问,但不能从另一个程序集访问.

内部保护:

类型或构件可以通过在声明它,该组件的任何代码被访问OR从另一个组件中的导出类中.来自另一个程序集的访问必须在一个类声明中进行,该类声明派生自声明受保护的内部元素的类,并且它必须通过派生类类型的实例进行.

请注意:protected internal表示" protectedOR internal"(同一程序集中的任何类,或任何派生类 - 即使它位于不同的程序集中).

......并且为了完整性:

私人的:

只能通过同一个类或结构中的代码访问类型或成员.

公众:

类型或成员可以由同一程序集中的任何其他代码或引用它的另一个程序集访问.

私人保护:

访问仅限于从当前程序集中的包含类派生的包含类或类型.
(自C#7.2起可用)

  • 这将是"受保护的",不是吗? (8认同)
  • 我可以有一个成员`protected internal`,这样它在当前程序集中是`protected`而在外部是完全不可用的? (2认同)
  • @Shimmy:你可以拥有一个带有protected*methods*的内部*class*.但是整个类将无法从外部程序集中获取. (2认同)
  • 是时候将“ private protected”添加到此列表中了。 (2认同)

Mar*_*ell 86

protected 可以由任何程序集中的任何子类使用.

protected internal就是一切protected,加上同一个程序集中的任何东西都可以访问它.

重要的是,它并不意味着"同一组件中的子类" - 它是两者的结合,而不是交集.

  • 对于读者而言,只是一个FYI,CLR也支持受保护和内部可访问性交叉的概念,但C#不支持这一点.C#仅支持本文中提到的两者的并集. (3认同)

And*_* AR 27

您可以在下表中找到差异,基于可访问性是,

在此输入图像描述

  • @ORMapper,我在 Excel 中创建并捕获为图像。它不是外部来源。 (4认同)
  • 伙计们,微软现在遵循我的风格...... https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers#summary-table (4认同)
  • 漂亮的答案,它非常清楚地传达了每个访问修饰符之间的差异。 (2认同)

aba*_*hev 23

在实践中,关于方法:

protected - 可以访问继承的类,否则是私有的.

internal - public仅用于程序集内的类,否则为private.

protected internal - 表示protected internal - 对于继承的类程序集内的任何类,可以访问方法.


Sto*_*ely 10

在理解"受保护的内部"访问器的范围时仍然存在很多困惑,尽管大多数都正确定义了定义.这有助于我理解"受保护"和"受保护的内部"之间的混淆:

公众在集会内外真正公开(公共内部/公共外部)

保护在程序集内部和外部受到保护(受保护的内部/受保护的外部)(顶级类不允许)

private在程序集内外非常私有(私有内部/私有外部)(不允许在顶级类中)

内部在程序集内部是公共的,但在私有(公共内部/排除外部)之外被排除在程序集之外

protected internal在程序集内部是公共的,但在程序集外部受到保护(公共内部/受保护的外部)(不允许在顶级类中)

如你所见,受保护的内部是一个非常奇怪的野兽.不直观.

这就引出了一个问题:为什么微软没有创建(受保护的内部/被排除的外部),或者我猜某种"私人保护"或"内部受保护"?大声笑.似乎不完整?

除了混淆之外,您可以将公共或受保护的内部嵌套成员嵌套在受保护,内部或私有类型中.为什么要在内部类中访问嵌套的"受保护内部",以排除外部程序集访问?

微软称这种嵌套类型受其父类型范围的限制,但这不是编译器所说的.您可以在内部类中编译受保护的内部,这应该将范围限制为仅仅是程序集.

对我来说这感觉就像不完整的设计.它们应该将所有类型的范围简化为明确考​​虑继承的系统,以及嵌套类型的安全性和层次结构.这将使对象的共享非常直观和精细,而不是基于不完整的范围系统发现类型和成员的可访问性.


小智 7

protected:变量或方法仅适用于子类(在任何程序集中)

protected internal:可用于任何程序集中的子类以及同一程序集中的所有类