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

时间:2010-02-15 08:32:37

标签: c# oop

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

4 个答案:

答案 0 :(得分:8)

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

基本上是会员:

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

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

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

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

答案 1 :(得分:5)

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

internal (C# Reference)

  

内部访问的常见用途是   基于组件的开发因为它   启用一组组件   没有私下合作   暴露于其余的   应用代码。例如,a   用于构建图形用户的框架   接口可以提供控制和   使用合作的表单类   有内部访问权限的成员以来   这些成员是内部的,他们是   没有暴露于使用的代码   框架。

     

引用类型或错误是错误的   外部访问的成员   它所在的组件   定义

修改

来自Scope of internal method in C#?

  

您可能想要一个公共方法   可以被其他人调用的类   程序集中的类,但不是   大会的客户。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

考虑这种情况:

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

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