在将类定义为内部时,您是否将通常是公共字段的内容定义为内部?或者你让他们公开?我有一组带有公共/私有方法的类,我决定将它们设置为内部。现在,我应该将类的修饰符更改为 internal 并让其余的方法/属性保持原样(公共/私有)还是将它们切换为(内部/私有)?
我不认为将其更改为内部有什么重要意义,如果以后由于某种原因我想将它们重新设置为公开,那么必须进行大量工作才能再次将它们重新公开。
对此还有其他想法吗?
在将类定义为内部时,您是否将通常是公共字段的内容定义为内部?或者你让他们公开?我有一组带有公共/私有方法的类,我决定将它们设置为内部。现在,我应该将类的修饰符更改为 internal 并让其余的方法/属性保持原样(公共/私有)还是将它们切换为(内部/私有)?
我不认为将其更改为内部有什么重要意义,如果以后由于某种原因我想将它们重新设置为公开,那么必须进行大量工作才能再次将它们重新公开。
对此还有其他想法吗?
我看不出有任何理由不将它们公开,因为无论如何外部集会都看不到您的课程。我认为这可能很重要的唯一情况是在该类上使用反射。
如果我有一个内部类,我将类成员保留为公共的(或者如果它们是这样的话,当然是受保护的/私有的)。我发现我经常有一些我希望我可以保留在内部的课程,但我最终不得不公开,并且将所有适当的成员都切换回公共是很烦人的。
您绝对不应该将私有成员更改为内部成员,因为这会使它们更易于访问。无需将公共成员更改为内部成员,因为定义程序集之外的任何内容都无法获得对内部类的引用。
我认为,如果类型本身是公开的,我认为您应该给成员通常的可见性。
也就是说,作为公共 API 一部分的成员应该是公共的,而应该只对“朋友”类可见的特殊用途助手的成员应该是内部的。
这意味着,如果您决定公开该类型,则成员可见性不会发生任何变化。
更重要的是,它还记录了您的意图 - 任何阅读您的代码的人都将能够识别哪些(如果有)成员是内部成员。
我们对内部类中的成员使用 internal 关键字,目的是明确的。但是,如果隐式实现内部接口,则它会失败,其中成员必须定义为公共的。我们不知道为什么,并认为这是我们必须忍受的语言规范中的一个意外错误。
在 Reflector 中挖掘一下,你会发现 BCL 本身在这方面非常不一致。你会看到很多内部类有public
成员,还有很多其他有internal
成员。有几个班级甚至将两者混合搭配,没有我能够辨别的特定韵律或理由。
这里没有“正确”的答案,但是当您需要对此做出决定时,您应该考虑以下几点:
internal
成员不能隐式实现接口,显式实现始终是私有的。因此,如果您希望通过类实例可以访问接口成员(Dispose
方法IDisposable
是常见的),则它们需要是公共的。
类型可见性可以改变。您可能会决定某个internal
类具有一些您希望向外部提供的有价值的功能。但是,如果您这样做,那么所有人都可以访问所有公共成员。你应该提前决定这是否是你想要的。
另一方面,创建internal
类的另一个原因public
是,如果您决定需要对它进行子类化,并且派生类应该位于不同的程序集中。在这种情况下,您的一些internal
成员可能应该是protected internal
,否则派生类将无法访问他们可能需要的成员。
最后,这一切都归结为编写可供其他人阅读和维护的代码。对于维护程序员来说,修饰符internal
可能意味着两件非常不同的事情:
它对外界似乎没有用,但实际上也不会有害。一个典型的例子是一个实用程序类,它在 5 分钟内完成,并且没有做太多的验证或错误检查。在这种情况下,public
只要他们稍微收紧代码和/或记录如何正确使用它,就可以做到这一点。通过使成员明确这一假设public
。
它实际上对于外部消费是不安全的;它可能会操纵一些受保护的状态,使句柄或事务处于打开状态等。在这种情况下,您确实希望使各个方法internal
绝对清楚地表明没有其他人应该使用这个类,永远。
选择适合您的方案的任何一个。