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中的名称空间