繁体   English   中英

为什么C#允许方法/成员在类是内部时公开

[英]Why C# allows methods/members to be public when the class is internal

我有一个我标记为内部的类,我将字段和方法标记为公共。 它编译时没有错误或警告。 是否有任何特定的需要将方法作为public和class作为内部(除非它们是从接口或类实现的)?

它没有任何不利影响,也意味着如果您决定公开该类型,则无需更改成员的可访问性。

基本上对于会员:

  • public表示任何可以看到Type的人都可以看到该成员。

  • internal表示该成员仅在当前程序集中可见,即使Type是公开可见的。

所以你的选择将基于哪一个是最合适的。 一般来说,将成员公开是最合适的(即任何可以看到Type的人都可以看到,即Type的公共API的一部分)。 您可以将成员设置为内部,原因与您在公共类中创建内部成员的原因相同 - 通常是辅助成员,只应对同一程序集中的“friend”类可见,并且不构成公共API的一部分。

此外,内部类型可以从公共类型派生,因此可以继承和覆盖公共成员。 允许被覆盖的公众成员,而不是新公共成员是否有意义?

标记为公共方法内部的类将允许同一组件中的其他类引用这些方法。

内部(C#参考)

内部访问的一个常见用途是基于组件的开发,因为它使一组组件能够以私有方式进行协作,而不会暴露给其他应用程序代码。 例如,用于构建图形用户界面的框架可以提供使用具有内部访问权限的成员进行协作的Control和Form类。 由于这些成员是内部成员,因此它们不会暴露给使用该框架的代码。

引用具有内部访问权限的类型或成员在组件定义之外是错误的。

编辑

C#内部方法的范围?

您可能需要公共类上的方法,该方法可以由程序集中的其他类调用,但不能由程序集的客户端调用。

没有任何警告,因为它没有任何不利影响。 无论如何,无论您将其标记为公共成员还是内部成员,都无法访问其他成员。

考虑这种情况:

你有一个FooFactory创建实现IFoo的对象。 您的IFoo实现可能是内部的,因为您不希望将它们暴露给仅使用IFoo的其他程序集。 IFoo实现的成员必须是公共的,以便可以在其他程序集中使用它们。

所以,正如我现在已经阅读了你的所有问题,我认为内部类的方法没有任何理由是公开的,除非有一种方法可以通过接口或基类从其他程序集访问这些类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM