有人能解释一下c#中受保护的内部修饰符和受保护的内部修饰符的区别吗?看起来它们的行为是一样的。


当前回答

这个描述可能会有帮助

内部成员

类的内部成员是可用的,或在程序集中创建对象或在派生类中访问,或者您可以说可以在程序集中的所有类中访问它。

保护成员

类的受保护成员仅在包含类中可用(在其中声明了类),并且在程序集内部和程序集外部的派生类中可用。

保护内部

Protected内部访问修饰符为Protected或Internal的组合。

受保护内部成员可以在其声明创建对象或通过继承该类的整个程序集中使用。并且只能在派生类的程序集之外访问。

其他回答

下表显示了其中的差异。Protected internal与Protected相同,只是它还允许来自同一程序集中其他类的访问。

“protected internal”访问修饰符是“protected”和“internal”修饰符的联合。

来自MSDN, Access Modifiers (c# Programming Guide):

保护:

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

内部:

类型或成员可以被同一程序集中的任何代码访问, 但不是来自另一个集会。

保护内部:

中的程序集中的任何代码都可以访问类型或成员 它是在哪个类中声明的,还是在另一个类中的派生类中 组装。来自另一个程序集的访问必须在类中进行 派生自受保护对象所在类的 内部元素被声明,它必须通过 派生类类型的实例。

注意:protected internal意味着“protected OR internal”(同一程序集中的任何类,或任何派生类——即使它在不同的程序集中)。

...为了完整起见:

私人:

类型或成员只能由相同类或类中的代码访问 结构体。

公众:

类型或成员可以被相同类型中的任何其他代码访问 程序集或引用该程序集的其他程序集。

私人保护:

类派生的包含类或类型的访问受到限制 在当前程序集中包含类。 (自c# 7.2起可用)

Protected可以被任何程序集的任何子类使用。

Protected internal是指受保护的所有内容,再加上同一程序集中的任何内容都可以访问它。

重要的是,它并不意味着“同一程序集中的子类”——它是两者的并集,而不是交集。

我已经把这些术语的定义读得很清楚了。

Protected:访问限制在类定义内以及从该类继承的任何类内。类型或成员只能通过同一类或结构中的代码或从该类派生的类中的代码访问。

内部:访问仅限于当前项目程序集中定义的类。类型或成员只能由同一类中的代码访问。

Protected-Internal:访问权限仅限于从包含类派生的当前程序集或类型。

受保护的内部最佳套件:当您希望在来自另一个程序集的派生类中使用成员或类型,同时只想在父程序集中使用该成员或类型,而不从声明它的类派生时。 此外,如果您只想使用不从其他类派生的成员或类型,则在同一程序集中只能使用internal。