3

在将类定义为内部时,您是否将通常是公共字段的内容定义为内部?或者你让他们公开?我有一组带有公共/私有方法的类,我决定将它们设置为内部。现在,我应该将类的修饰符更改为 internal 并让其余的方法/属性保持原样(公共/私有)还是将它们切换为(内部/私有)?

我不认为将其更改为内部有什么重要意义,如果以后由于某种原因我想将它们重新设置为公开,那么必须进行大量工作才能再次将它们重新公开。

对此还有其他想法吗?

4

6 回答 6

6

我看不出有任何理由不将它们公开,因为无论如何外部集会都看不到您的课程。我认为这可能很重要的唯一情况是在该类上使用反射。

于 2010-05-03T10:16:27.663 回答
2

如果我有一个内部类,我将类成员保留为公共的(或者如果它们是这样的话,当然是受保护的/私有的)。我发现我经常有一些我希望我可以保留在内部的课程,但我最终不得不公开,并且将所有适当的成员都切换回公共是很烦人的。

于 2010-05-03T10:22:22.887 回答
1

您绝对不应该将私有成员更改为内部成员,因为这会使它们易于访问。无需将公共成员更改为内部成员,因为定义程序集之外的任何内容都无法获得对内部类的引用。

于 2010-05-03T10:22:03.353 回答
1

我认为,如果类型本身是公开的,我认为您应该给成员通常的可见性。

也就是说,作为公共 API 一部分的成员应该是公共的,而应该只对“朋友”类可见的特殊用途助手的成员应该是内部的。

这意味着,如果您决定公开该类型,则成员可见性不会发生任何变化。

更重要的是,它还记录了您的意图 - 任何阅读您的代码的人都将能够识别哪些(如果有)成员是内部成员。

于 2010-05-03T10:41:44.713 回答
0

我们对内部类中的成员使用 internal 关键字,目的是明确的。但是,如果隐式实现内部接口,则它会失败,其中成员必须定义为公共的。我们不知道为什么,并认为这是我们必须忍受的语言规范中的一个意外错误。

于 2010-05-03T12:52:21.403 回答
0

在 Reflector 中挖掘一下,你会发现 BCL 本身在这方面非常不一致。你会看到很多内部类有public成员,还有很多其他有internal成员。有几个班级甚至将两者混合搭配,没有我能够辨别的特定韵律或理由。

这里没有“正确”的答案,但是当您需要对此做出决定时,您应该考虑以下几点:

  • internal成员不能隐式实现接口,显式实现始终是私有的。因此,如果您希望通过类实例可以访问接口成员(Dispose方法IDisposable是常见的),则它们需要是公共的。

  • 类型可见性可以改变。您可能会决定某个internal类具有一些您希望向外部提供的有价值的功能。但是,如果您这样做,那么所有人都可以访问所有公共成员。你应该提前决定这是否是你想要的。

  • 另一方面,创建internal类的另一个原因public是,如果您决定需要对它进行子类化,并且派生类应该位于不同的程序集中。在这种情况下,您的一些internal成员可能应该是protected internal,否则派生类将无法访问他们可能需要的成员。

最后,这一切都归结为编写可供其他人阅读和维护的代码。对于维护程序员来说,修饰符internal可能意味着两件非常不同的事情:

  1. 它对外界似乎没有用,但实际上也不会有害。一个典型的例子是一个实用程序类,它在 5 分钟内完成,并且没有做太多的验证或错误检查。在这种情况下,public只要他们稍微收紧代码和/或记录如何正确使用它,就可以做到这一点。通过使成员明确这一假设public

  2. 它实际上对于外部消费是不安全的;它可能会操纵一些受保护的状态,使句柄或事务处于打开状态等。在这种情况下,您确实希望使各个方法internal绝对清楚地表明没有其他人应该使用这个类,永远

选择适合您的方案的任何一个。

于 2010-05-03T13:55:47.653 回答