C# 为什么';你有私人包裹吗?

C# 为什么';你有私人包裹吗?,c#,java,package-private,C#,Java,Package Private,我正在学习C#并且来自Java世界,我有点困惑地看到C#没有“包私有”。我看到的大多数评论都是“你做不到,语言不是这样设计的”。我还看到了一些涉及内部和部分的变通方法,还有一些评论说这些变通方法不符合语言的设计 为什么C#是这样设计的?另外,我将如何执行以下操作:我有一个Product类和一个ProductInstance类。我希望创建ProductInstance的唯一方法是通过Product类中的工厂方法。在Java中,我会将ProductInstance放在与Product相同的包中,但将

我正在学习C#并且来自Java世界,我有点困惑地看到C#没有“包私有”。我看到的大多数评论都是“你做不到,语言不是这样设计的”。我还看到了一些涉及
内部
部分
的变通方法,还有一些评论说这些变通方法不符合语言的设计


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

internal
是您所追求的。这意味着该成员可由同一程序集中的任何类访问。为此目的使用它没有什么错(Product&ProductInstance),这也是它设计的目的之一。C#选择不让名称空间变得重要——它们用于组织,而不是确定哪些类型可以彼此看到,就像java中的包私有一样


部分
内部
包私有
完全不同。这只是一种将类的实现拆分为多个文件的方法,并附带一些扩展性选项。包的存在方式与Java中的不同。名称空间用于组织代码和防止命名冲突,但不用于访问控制。项目/程序集可用于访问控制,但不能像使用包那样具有嵌套的项目/程序集


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

将产品类构造函数设为私有,然后使用一个公共静态函数返回一个ProductInstance,例如:var p=Product.GetProductInstanceLooking查看答案,我看不到为什么。我觉得设置一个方法
internal
是一种很大的代码味道,它只被少数几个“友好”类使用(参见C++中的
friend
关键字)。我不想仅仅为了防止臭烘烘的访问而将我的应用程序分成数百个dll,也不想让我的详细实现保持开放(基本上对整个开发团队公开)。我是否应该编写包含十个子类的巨型类来克服这个限制?因此我只需要将
ProductInstance
的构造函数标记为
internal
?@Vivin,是的,可能该类也是。不,仅为一个工厂类创建程序集是一个糟糕的建议。拥有数百个程序集使项目难以管理。@miguel,你将我的答案混为一谈,建议每个类创建一个单独的程序集,这相当令人惊讶。当你说“出于这个目的使用它(Product&ProductInstance)没有什么错误”我认为这意味着您应该为此目的创建一个程序集。