C#の名前空間とJavaのパッケージの違い


98

C#の名前空間とJavaのパッケージの(使用に関する)違いは何ですか?

回答:


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

パッケージはネストできません。1つのソースファイルに含めることができるパッケージステートメントは1つだけです。

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#では、1つのファイルに複数の名前空間を含めることができます。Javaでは、1つのファイルが1つのパッケージに属します(前を参照)。

Javaにはデフォルト/パッケージのアクセシビリティがあります。C#の内部アクセシビリティはアセンブリに組み込まれています。

VSとEclipseを使用して、それらにプロジェクトを構築させる場合、違いはあまり感じられません。


35

Javaには「名前空間」などの用語はありません。ただし、名前のスコープを提供するという点では、パッケージはJavaの名前空間として機能します。アクセシビリティモデルの一部でもあります。

Java言語仕様のセクション7から:

プログラムは、パッケージのセットとして編成されています。各パッケージには、タイプの独自の名前のセットがあり、名前の競合を防ぐのに役立ちます。最上位の型は、その型がパブリックとして宣言されている場合にのみ宣言するパッケージの外部でアクセスできます(§6.6)。

編集:わかりました、わかりました:JavaパッケージはC#名前空間にていますが、C#名前空間とアクセス可能性は完全に直交していますが、アクセシビリティに影響を与える点が異なります。


12

C ++ / C#では、名前空間は名前を分割するためだけに使用され、異なる場所の変数に誤って同じ名前を使用して衝突を回避します。

Javaでは、パッケージはそれだけではありません。パッケージはモジュールに使用され、命名の側面はその一部にすぎません。


0

Javaでは、パッケージに影響を与えるクラスにさまざまなアクセス指定子を適用できます。

protected:同じパッケージおよび別のパッケージのサブクラスにアクセス可能、デフォルト:同じパッケージにアクセス可能、public:ユニバーサルにアクセス可能、private:同じパッケージからもアクセス不可能

これらのタイプのアクセス指定子は、cシャープの名前空間には適用されません。


-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では同じメソッドを使用します。複数のクラスを1つのパッケージにまとめ、何度も使用します。独自性を高めます。あなたは一度書いて何度も使う。1つのパッケージ内の関連クラス。何度もコーディングする必要はありません。


2
問題は、C#の名前空間とJavaのパッケージの違いについてです。この回答はこれについてはまったく触れていません。
ヨハン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.