为什么C#没有包私有?

时间:2011-02-11 01:55:36

标签: c# java package-private

我正在学习C#并来自Java世界,我有点困惑,看到C#没有“包私有”。我见过的关于这一点的大多数评论都是“你不能这样做;语言不是这样设计的”。我还看到了一些涉及internalpartial的解决方法以及表示这些变通办法违背语言设计的评论。

为什么C#这样设计?另外,我将如何执行以下操作:我有一个Product类和一个ProductInstance类。我希望创建ProductInstance的唯一方法是通过Product类中的工厂方法。在Java中,我会将ProductInstance放在与Product相同的包中,但要使其构造函数package private以便只有Product才能访问它。这样,任何想要创建ProductInstance的人都只能通过Product类中的工厂方法执行此操作。我如何在C#中完成同样的事情?

2 个答案:

答案 0 :(得分:26)

internal就是你所追求的。这意味着该成员可由同一程序集中的任何类访问。将它用于此目的(Product& ProductInstance)没有任何问题,并且是它的设计之一。 C#选择不使名称空间显着 - 它们用于组织,而不是确定哪些类型可以看到彼此,如在带有包私有的java中。

partial完全不是internal package private。它只是一种将类的实现拆分为多个文件的方法,并提供了一些可扩展性选项。

答案 1 :(得分:7)

包实际上并不像在Java中那样存在。命名空间用于组织代码并防止命名冲突,但不用于访问控制。项目/程序集可用于访问控制,但您不能像使用软件包那样嵌套项目/程序集。

使用internal隐藏一个项目的成员。