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

问题描述 投票:221回答:10

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

c# .net access-modifiers
10个回答
376
投票

“受保护的内部”访问修饰符是“受保护”和“内部”修饰符的并集。

来自MSDN, Access Modifiers (C# Programming Guide)

protected

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

internal

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

内部保护:

类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在一个类声明中进行,该声明派生自声明受保护的内部元素的类,并且它必须通过派生类类型的实例进行。

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

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

private

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

public

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

private protected

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


0
投票

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


86
投票

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

protected internalprotected所有的东西,而且同一个装配中的任何东西都可以访问它。

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


23
投票

在实践中,关于方法:

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

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

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


17
投票

- 更新答案2019 -

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

enter image description here


10
投票

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

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

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

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

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

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

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

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

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

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

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


7
投票

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

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


3
投票

我已经读出了这些术语的非常明确的定义。

受保护:访问仅限于类定义和从类继承的任何类。类型或成员只能由同一个类或结构中的代码或从该类派生的类访问。

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

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


1
投票

受保护的会员

受保护的类的成员仅在包含的类(已声明它)中以及在程序集内的派生类中以及程序集外部中可用。

表示驻留在程序集外部的类是否可以通过仅继承该类来使用其他程序集的受保护成员。

我们可以通过继承该类来暴露程序集外的受保护成员,并仅在派生类中使用它。

注意:使用派生类中的对象无法访问受保护的成员。

内部成员

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

注意:使用对象创建或派生类无法在程序集外部访问内部成员。

受保护的内部

受保护的内部访问修饰符是受保护的或内部的组合。

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

注意:受保护的内部成员在同一个程序集中作为内部工作,在程序集外部作为受保护的工作。


1
投票

public - 声明为public的成员(Functions和Variables)可以从任何地方访问。

私人 - 无法从课外访问私人会员。这是成员的默认访问说明符,即如果没有为成员(变量或函数)指定访问说明符,它将被视为私有。因此,字符串PhoneNumber;相当于私有字符串PhoneNumber。

protected - 只能从子类访问受保护的成员。

internal - 只能在同一个程序集中访问它。

protected internal - 可以在同一个程序集中以及派生类中访问它。

© www.soinside.com 2019 - 2024. All rights reserved.