C#中的命名空间和Java中的包之间的区别

C#中的名称空间和Java中的包之间有什么区别(在使用方面)?

来自: http : //www.javacamp.org/javavscsharp/namespace.html


Java的

包被用来组织文件或公共types以避免types冲突。 包结构可以映射到文件系统。

System.Security.Cryptography.AsymmetricAlgorithm aa; 

可能被replace:

 import System.Security.Crypography; class xxx { ... AsymmetricAlgorithm aa; 

软件包没有别名。 您必须使用导入语句或完全限定名称来提及特定的types。

 package N1.N2; class A {} class B {} 

要么

 package N1.N2; class A {} 

另一个源文件:

 package N1.N2; class B {} 

包不能嵌套。 一个源文件只能有一个包语句。

C#

命名空间被用来组织程序,既作为一个程序的“内部”组织系统,也作为一个“外部”组织系统。

 System.Security.Cryptography.AsymmetricAlgorithm aa; 

可能被replace:

 using System.Security.Crypography; AsymmetricAlgorithm aa; 

或者,可以指定命名空间的别名,例如

 using myAlias = System.Security.Crypography; 

然后参考该类

 myAlias.AsymmetricAlgorithm namespace N1.N2 { class A {} class B {} } 

要么

 namespace N1 { namespace N2 { class A {} class B {} } } 

有一些细节有所不同。

在Java中,目录结构应该与包结构匹配。 在C#中没有这样的限制。

在C#中,一个文件中可以有多个名称空间。 在Java中,一个文件属于一个包(见前)。

Java具有默认/包可访问性。 C#内部可访问性进入程序集。

如果你使用VS和Eclipse,让他们构build项目,那么你将不会有太大的差异。

在Java中没有像“名称空间”这样的术语 – 就为名称提供一个范围而言,一个包在Java中是一个名称空间。 这也是可访问性模型的一部分。

从Java语言规范的第7部分 :

程序被组织为一组包。 每个包都有自己的一组types名称,这有助于防止名称冲突。 顶层types可以在包外部访问(第6.6节),只有在types声明为public的时才声明它。

编辑:好的澄清之后:一个Java包类似于 C#命名空间 – 除了它对可访问性有影响,而在C#命名空间和可访问性是完全正交的。

在C ++ / C#中,名称空间只是用于分区名称,以避免意外地在不同地方为variables使用相同的名称。

在Java中,软件包远不止于此 – 软件包用于模块,命名方面只是其中的一部分。

在Java中,您可以将各种访问说明符应用于将影响包的类。

保护:对同一个包和其他包中的子类都是可访问的,默认:对同一个包可访问,public:普遍可访问,私有:甚至不能被同一个包访问。

这些types的访问说明符不适用于c sharp中的名称空间