命名空间仅在C#/ .NET中的类可见性?

在C#中,你可以让一个类只在它自己的命名空间中可见,而不需要生活在一个不同的程序集中? 这对典型的不应该在其他地方使用的帮助类似乎很有用。 (即什么Java调用包私人类)

我不认为你想要什么是可能的。

你可以使课程internal但这只能防止大会以外的任何人使用类。 但是您仍然需要为每个要使用的名称空间创build一个单独的程序集 。 我假设这就是为什么你不想这样做。

获取C#编译器来强制命名空间可见性

这里有一篇文章( C#中的命名空间可见性 ),它展示了一种将部分类作为“假名称空间”forms使用的方法,您可能会发现它有帮助。

作者指出,这并不完美,他讨论了缺点。 主要的问题是C#devise者deviseC# 不能这样工作。 这在很大程度上偏离了C#/ .NET中预期的编码实践,这是.NET框架最大的优点之一。

这是一个巧妙的伎俩,现在这样做。

内部是组装(严格来说是模块)的隐私。 它对命名空间可见性没有影响。

在同一个程序集中从其他类中获得一个类的隐私的唯一方法是让一个类成为一个内部类。

在这一点上,如果这个类是私有的,那么对于那些不属于这个类或者外部类的东西,它是不可见的。

如果受到保护,每个人都可以看到,但在私密的情况下却可以看到,但对外部类的子类也是可见的。

 public class Outer { private class Hidden { public Hidden() {} } protected class Shady { public Shady() {} } public class Promiscuous { public Promiscuous() {} } } public class Sub : Outer { public Sub():base() { var h = new Hidden(); // illegal, will not compile var s = new Shady(); // legal var p = new Promiscuous(); // legal } } public class Outsider { public Outsider() { var h = new Outer.Hidden(); // illegal, will not compile var s = new Outer.Shady() // illegal, will not compile var p = new Outer.Promiscuous(); // legal } } 

实质上,实现你想要的唯一方法是使用外部类作为命名空间的一种forms,并在该类中进行限制。

如果只有一个程序集,则可以根据需要在该程序集中定义尽可能多的名称空间,但无论您在IDE中应用哪种修改器,都将始终能够在其他名称空间中查看这些类。

不知道这是否是直接可能的,但一些好的方法来伪造它将是:

1)让需要这种东西的类从具有辅助类作为内部类的单个类inheritance。

2)使用扩展方法,然后只引用名称空间内的扩展方法。