我们的一个项目中有很多代码如下所示:
internal static class Extensions { public static string AddFoo(this string s) { if (s == null) { return "Foo"; } return $({s}Foo); } }
除了“以后更容易将类型公开”之外,是否有任何明确的理由这样做?
我怀疑它只在非常奇怪的边缘情况下(Silverlight 中的反射)才重要,或者根本不重要。
更新:这个问题是我 2014 年 9 月博客的主题。谢谢你的好问题!
即使在编译器团队内部,也存在相当多的关于这个问题的争论。
首先,了解规则是明智的。类或结构的公共成员是 任何可以访问包含类型的 对象都可以访问的成员。因此,内部类的公共成员实际上是内部的。
那么现在,给定一个内部类,您希望在程序集中访问的它的成员应该标记为公共的还是内部的?
我的意见是:将此类成员标记为公开。
我使用“public”来表示“此成员不是实现细节”。受保护的成员是一个实现细节;使派生类工作需要一些关于它的东西。内部成员是实现细节;该程序集内部的其他东西需要该成员才能正常工作。一个公共成员说“这个成员代表了这个对象提供的关键的、记录在案的功能。”
基本上,我的态度是:假设我决定把这个内部类变成一个公共类。为了做到这一点,我想改变 一件事 :类的可访问性。如果将内部类转换为公共类意味着我还必须将内部成员转换为公共成员,那么该成员是该类的 公共表面区域 的一部分,它应该首先是公共的。
其他人不同意。有一个特遣队说他们希望能够看一眼成员的声明并立即知道它是否只会从内部代码中调用。
不幸的是,这并不总是很好。例如,实现内部接口的内部类仍然必须将实现成员标记为公共,因为 它们是该类的公共表面的一部分 。