Unterschied zwischen Namespace in C # und Paket in Java

98

Was ist der Unterschied (in Bezug auf die Verwendung) zwischen Namespaces in C # und Paketen in Java?

Mazzy
quelle

Antworten:

74

Von: http://www.javacamp.org/javavscsharp/namespace.html


Java

Pakete werden zum Organisieren von Dateien oder öffentlichen Typen verwendet, um Typkonflikte zu vermeiden. Paketkonstrukte können einem Dateisystem zugeordnet werden.

system.security.cryptography.AsymmetricAlgorithm aa;

kann ersetzt werden:

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

Es gibt keinen Alias ​​für Pakete. Sie müssen eine Importanweisung oder einen vollständig qualifizierten Namen verwenden, um den spezifischen Typ anzugeben.

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

oder

package n1.n2;
   class A {}

Eine andere Quelldatei:

package n1.n2;
   class B {}

Paket kann nicht verschachtelt werden. Eine Quelldatei kann nur eine Paketanweisung enthalten.

C #

Namespaces werden zum Organisieren von Programmen verwendet, sowohl als "internes" Organisationssystem für ein Programm als auch als "externes" Organisationssystem.

System.Security.Cryptography.AsymmetricAlgorithm aa;

kann ersetzt werden:

using System.Security.Crypography; 
AsymmetricAlgorithm aa;

Alternativ könnte man einen Alias ​​für den Namespace angeben, z

using myAlias = System.Security.Crypography; 

und beziehen Sie sich dann auf die Klasse mit

myAlias.AsymmetricAlgorithm 

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

oder

namespace N1
{
    namespace N2
    {
        class A {}
        class B {}
    }
}
RuudVanNistelrooy
quelle
3
Tolle Antwort, aber der Java-Import wird meiner Meinung nach nicht funktionieren. Es sollte sein import system.security.crypography.AsymmetricAlgorithm;. Da Sie in Java eine Klasse importieren müssen, kein Paket. Es ist möglich, alle Klassen in einem Paket mit einem import package.*zu importieren, aber auch das importiert die Klassen, nicht das Paket.
Imus
Gibt es eine Möglichkeit zum Namespace in Java, ohne so viele Ordner zu verwenden? Ein namespaceSchlüsselwort in Java wäre schön.
42

Es gibt einige Details, die sich unterscheiden.

In Java sollte die Verzeichnisstruktur mit der Paketstruktur übereinstimmen. Keine solche Einschränkung in C #.

In C # können Sie mehrere Namespaces in einer Datei haben. In Java gehört eine Datei zu einem Paket (siehe oben).

Java hat Standard- / Paketzugriff. Die interne Barrierefreiheit von C # erfolgt in Baugruppen.

Wenn Sie VS und Eclipse verwenden und das Projekt strukturieren lassen, werden Sie die Unterschiede nicht viel spüren.

Acaz Souza
quelle
35

In Java gibt es keinen Begriff wie "Namespace" - ein Paket fungiert jedoch in Java als Namespace, um einen Bereich für Namen bereitzustellen. Es ist auch Teil des Barrierefreiheitsmodells.

Aus Abschnitt 7 der Java-Sprachspezifikation :

Programme sind als Paketsätze organisiert. Jedes Paket verfügt über eigene Namen für Typen, um Namenskonflikte zu vermeiden. Auf einen Typ der obersten Ebene (§6.6) außerhalb des Pakets kann nur zugegriffen werden, wenn der Typ als öffentlich deklariert ist.

EDIT: Okay, nach der Klarstellung: Ein Java-Paket ähnelt einem C # -Namensraum - mit der Ausnahme, dass es sich auf die Barrierefreiheit auswirkt, während in C # -Namensräumen und die Barrierefreiheit vollständig orthogonal sind.

Jon Skeet
quelle
12

In C ++ / C # werden Namespaces nur zum Partitionieren von Namen verwendet, um Kollisionen zu vermeiden, indem versehentlich derselbe Name für eine Variable an verschiedenen Stellen verwendet wird.

In Java sind Pakete weit mehr als nur das - Pakete werden für Module verwendet, der Namensaspekt ist nur ein Teil davon.

kba
quelle
0

In Java können Sie verschiedene Zugriffsspezifizierer auf Klassen anwenden, die sich auf Ihre Pakete auswirken.

protected: Zugriff auf dasselbe Paket und seine Unterklassen in einem anderen Paket, Standard: Zugriff auf dasselbe Paket, public: universell zugänglich, privat: nicht einmal für dasselbe Paket zugänglich.

Diese Art von Zugriffsspezifizierern gilt nicht für Namespace in cis

dasumohan89
quelle
-2

Ein Namespace ist wie ein neuer Ordner. Alle Unterordner sind Unter-Namespaces. Wenn wir einen Namespace als eine Funktion betrachten, wie wir eine Namespace-Werbung unter Marketing-Namespace haben, verwenden wir marketing.advertising.adsclass.adsmethod. Sehr einfach, ein Problem zu lösen. Java hat die gleiche Methode per Paket, ist aber für Neuankömmlinge komplex.

In C #

'' 'Namespace-Marketing {

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

     }

}}

Zur Verwendung in der Client-Klasse

using marketing;
using marketing.advertising;

'' 'In Java verwenden Sie die gleiche Methode. Sie packen mehrere Klassen in ein Paket und verwenden es mehrmals. Es erhöht die Einzigartigkeit. Sie schreiben einmal und verwenden viele Male. Verwandte Klassen in einem Paket. Sie müssen nicht oft codieren.

Rashid Irshad
quelle
2
Die Frage betrifft den Unterschied zwischen Namespaces in C # und Paketen in Java. Diese Antwort spricht dies überhaupt nicht an.
Johan