2010-05-03 55 views
3

将类定义为内部时,您是否定义了通常将公共字段作为内部的内容?或者你把它们作为公共?我有一套公共/私人方法的课程,我决定将其设置为内部课程。现在,我是否应该将类的修饰符更改为internal,并让其余的方法/属性(public/private)或切换到(internal/private)?将类定义为内部时,您是否定义了通常将公共字段作为内部的内容?

我没有看到把它改变为内部的一个重要观点,如果由于某种原因后来我想将它们重新设置为公共,它将会使很多工作必须重新公开。

还有其他想法吗?

回答

6

我看不出有什么理由不让他们成为公众,因为无论如何你的课程对外部程序集都是不可见的。我认为这可能很重要的唯一情况是对该类使用反射。

1

你肯定不应该改变私人成员到内部,因为这将使他们访问。无需将公共成员更改为内部,因为定义程序集之外的任何内容都无法获得对内部类的引用。

2

如果我有一个内部类,我会将类成员保留为public(或当然,如果这就是保护/私有)。我发现我经常有班,我希望我能保持内部,我最终不得不最终公开,并将所有适当的成员重新公开是恼人的。

1

我认为你应该给一般成员相同的可见性,如果你的类型本身是公开的。

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

这意味着如果您决定公开该类型,将不会更改成员可见性。

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

0

我们对内部类中的成员使用内部关键字,因此意图很明确。然而,如果一个人隐式实现了内部接口,其成员必须被定义为公共的,它就会失败。我们不知道为什么,并将其视为我们必须忍受的语言规范中的一个意外错误。

0

在Reflector中挖掘一下,你会发现BCL本身在这方面是非常不一致的。您会看到很多内部课程,其中public会员以及其他许多人会员都会参加internal会员。几个班甚至混合和匹配两个没有特别的韵或我能够辨别的原因。

没有“正确”的答案在这里,但也有当你需要做出决定对这个你应该考虑几件事情:

  • internal成员不能隐含实现一个接口,并明确实现总是私人的。因此,如果您希望通过类别实例(的Dispose方法是常见方法)访问接口成员,则它们需要公开。

  • 类型的可见性可以改变。你可能会决定一个internal班有一些宝贵的功能,你想提供给外部的道路。但如果你这样做,那么所有公众成员变得可访问大家。你应该提前决定,如果这是你想要的。

  • 在另一方面,另一个原因则可能做出internalpublic是,如果你决定,你需要它的子类和派生类应该在不同的装配。在这种情况下,您的某些internal成员应该可能是protected internal,否则派生类将无法访问他们可能需要的成员。

最后,什么都归结为是被其他人阅读和维护编写代码。修饰符internal意味着两种完全不同的东西来维护程序员:

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

  2. 这实际上是不安全外部消费;它可能会操纵一些受保护的状态,使句柄或交易处于打开状态等等。在这种情况下,您确实希望使各个方法internal明确表示其他人不应该使用此类,有史以来

选择哪一个适合您的情况。

相关问题