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

Maz*_*zzy 93 c# java

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

小智 70

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


Java的

包用于组织文件或公共类型以避免类型冲突.包构造可以映射到文件系统.

system.security.cryptography.AsymmetricAlgorithm aa;
Run Code Online (Sandbox Code Playgroud)

可能会被替换:

import system.security.Crypography; 
class xxx { ...
AsymmetricAlgorithm aa;
Run Code Online (Sandbox Code Playgroud)

包没有别名.您必须使用import语句或完全限定名称来提及特定类型.

package n1.n2;
    class A {}
    class B {}
Run Code Online (Sandbox Code Playgroud)

要么

package n1.n2;
   class A {}
Run Code Online (Sandbox Code Playgroud)

另一个源文件:

package n1.n2;
   class B {}
Run Code Online (Sandbox Code Playgroud)

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

C#

命名空间用于组织程序,既可以作为程序的"内部"组织系统,也可以作为"外部"组织系统.

System.Security.Cryptography.AsymmetricAlgorithm aa;
Run Code Online (Sandbox Code Playgroud)

可能会被替换:

using System.Security.Crypography; 
AsymmetricAlgorithm aa;
Run Code Online (Sandbox Code Playgroud)

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

using myAlias = System.Security.Crypography; 
Run Code Online (Sandbox Code Playgroud)

然后用类来引用该类

myAlias.AsymmetricAlgorithm 

namespace N1.N2
{
    class A {}
    class B {}
}
Run Code Online (Sandbox Code Playgroud)

要么

namespace N1
{
    namespace N2
    {
        class A {}
        class B {}
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,但我认为Java导入无法正常工作。应该是import system.security.crypography.AsymmetricAlgorithm;。由于在Java中,您必须导入一个类,而不是一个包。可以使用import package。*导入包中的所有类,但是也可以导入类,而不是包。 (3认同)

Aca*_*uza 40

有一些细节不同.

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

在C#中,您可以在一个文件中拥有多个名称空间.在Java中,一个文件属于一个包(参见前面的内容).

Java具有默认/包可访问性.C#内部可访问性在程序集中.

如果您使用VS和Eclipse并让它们构建项目,那么您将不会感受到太多差异.


Jon*_*eet 34

在Java中没有"命名空间"这样的术语 - 在提供名称范围方面,包在Java中充当命名空间.它也是可访问性模型的一部分.

Java语言规范的第7节:

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

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


kba*_*kba 12

在C++/C#中,名称空间仅用于对名称进行分区,以避免因意外地在不同位置对变量使用相同名称而发生冲突.

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