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


98

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

Answers:


74

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


爪哇

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

system.security.cryptography.AsymmetricAlgorithm aa;

可以替换:

import system.security.Crypography; 
class xxx { ...
AsymmetricAlgorithm aa;

软件包没有别名。您必须使用import语句或标准名称来提及特定类型。

package n1.n2;
    class A {}
    class B {}

要么

package n1.n2;
   class A {}

另一个源文件:

package n1.n2;
   class B {}

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

C#

命名空间用于组织程序,既可以作为程序的“内部”组织系统,又可以作为“外部”组织系统。

System.Security.Cryptography.AsymmetricAlgorithm aa;

可以替换:

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 {}
    }
}

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

有没有一种方法可以在Java中使用名称空间而不使用太多文件夹?namespaceJava中的关键字会很好。

42

有一些细节有所不同。

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

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

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

如果您使用VS和Eclipse并让他们构造项目,那么您将不会感到太多差异。


35

Java中没有“命名空间”之类的术语-包在Java中充当名称空间,但提供了名称范围。它也是可访问性模型的一部分。

Java语言规范的第7节开始

程序以软件包的形式组织。每个软件包都有自己的类型名称集,这有助于防止名称冲突。只有在声明了公共类型的情况下,才可以在声明它的包外部访问顶级类型(第6.6节)。

编辑:好的,在澄清之后:Java包类似于 C#名称空间-区别在于它会影响可访问性,而在C#中,名称空间和可访问性完全正交。


12

在C ++ / C#中,名称空间仅用于对名称进行分区,以免在不同的地方意外地对变量使用相同的名称来避免冲突。

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


0

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

protected:可用于同一软件包及其子类在另一个软件包中,默认值:可用于同一软件包,public:可通用访问,private:甚至不可被同一软件包访问。

这些类型的访问说明符不适用于c Sharp中的名称空间


-2

命名空间就像一个新文件夹一样,所有子文件夹都是子命名空间。如果我们将名称空间视为一个函数,例如在营销名称空间下有一个名称空间广告,则可以使用marketing.advertising.adsclass.adsmethod。解决问题非常容易。Java通过包具有相同的方法,但是对于新手来说很复杂。

在C#中

'''名称空间营销{

           class admissions{
                     int admissions_method(){
                     }
           }
     namespace advertising{
           class  advertisement{
                    void ad_in_newspaper( int no_of_lines){
                    }
                    void ad_on_tv(int seconds){
                    }

     }

}

在客户端类中使用

using marketing;
using marketing.advertising;

'''在Java中,您使用相同的方法。您将多个类打包在一个包中,并多次使用。它增加了唯一性。您编写一次并使用多次。一包中的相关类。无需多次编码。


2
问题在于C#中的名称空间与Java中的程序包之间的区别。这个答案根本没有解决这个问题。
约翰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.