Differenza tra lo spazio dei nomi in C # e il pacchetto in Java


98

Qual è la differenza (in termini di utilizzo) tra gli spazi dei nomi in C # e i pacchetti in Java?

Risposte:


74

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


Giava

I pacchetti vengono utilizzati per organizzare file o tipi pubblici per evitare conflitti di tipo. I costrutti del pacchetto possono essere mappati su un file system.

system.security.cryptography.AsymmetricAlgorithm aa;

può essere sostituito:

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

Non ci sono alias per i pacchetti. È necessario utilizzare l'istruzione import o il nome completo per menzionare il tipo specifico.

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

o

package n1.n2;
   class A {}

Un altro file sorgente:

package n1.n2;
   class B {}

Il pacchetto non può essere annidato. Un file sorgente può avere solo un'istruzione del pacchetto.

C #

Gli spazi dei nomi vengono utilizzati per organizzare i programmi, sia come sistema di organizzazione "interno" di un programma, sia come sistema di organizzazione "esterno".

System.Security.Cryptography.AsymmetricAlgorithm aa;

può essere sostituito:

using System.Security.Crypography; 
AsymmetricAlgorithm aa;

In alternativa, si potrebbe specificare un alias per lo spazio dei nomi, ad es

using myAlias = System.Security.Crypography; 

e quindi fare riferimento alla classe con

myAlias.AsymmetricAlgorithm 

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

o

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

3
ottima risposta ma l'importazione java non funzionerà credo. Dovrebbe essere import system.security.crypography.AsymmetricAlgorithm;. Poiché in java devi importare una classe, non un pacchetto. È possibile importare tutte le classi in un pacchetto con un import package.*ma anche questo importa le classi, non il pacchetto.
Imus

c'è un modo per lo spazio dei nomi in Java senza utilizzare così tante cartelle? Una namespaceparola chiave in Java sarebbe carina.

42

Ci sono alcuni dettagli che differiscono.

In Java la struttura della directory dovrebbe corrispondere alla struttura del pacchetto. Nessuna restrizione di questo tipo in C #.

In C # puoi avere più spazi dei nomi in un file. In Java un file appartiene a un pacchetto (vedi precedente).

Java ha l'accessibilità predefinita / pacchetto. L'accessibilità interna di C # va negli assembly.

Se usi VS ed Eclipse e lasci che strutturino il progetto, non sentirai molto le differenze.


35

Non esiste un termine come "spazio dei nomi" in Java - un pacchetto agisce come uno spazio dei nomi in Java, in termini di fornire un ambito per i nomi. Fa anche parte del modello di accessibilità.

Dalla sezione 7 delle specifiche del linguaggio Java :

I programmi sono organizzati come set di pacchetti. Ogni pacchetto ha il proprio set di nomi per i tipi, che aiuta a prevenire conflitti di nomi. Un tipo di primo livello è accessibile (§6.6) all'esterno del pacchetto che lo dichiara solo se il tipo è dichiarato pubblico.

EDIT: Ok, dopo il chiarimento: un pacchetto Java è simile a uno spazio dei nomi C #, tranne per il fatto che ha un impatto sull'accessibilità, mentre in C # gli spazi dei nomi e l'accessibilità sono del tutto ortogonali.


12

In C ++ / C #, gli spazi dei nomi vengono utilizzati solo per il partizionamento dei nomi per evitare collisioni utilizzando accidentalmente lo stesso nome per una variabile in luoghi diversi.

In Java, i pacchetti sono molto più di questo: i pacchetti sono usati per i moduli, l'aspetto dei nomi è solo una parte di esso.


0

In java puoi applicare vari specificatori di accesso alle classi che avranno un impatto sui tuoi pacchetti.

protetto: accessibile allo stesso pacchetto e alle sue sottoclassi in un altro pacchetto, predefinito: accessibile allo stesso pacchetto, pubblico: accessibile universalmente, privato: non accessibile nemmeno dallo stesso pacchetto.

Questi tipi di specificatori di accesso non sono applicabili allo spazio dei nomi in c diesis


-2

Uno spazio dei nomi è proprio come una nuova cartella, tutte le sottocartelle sono spazi dei nomi secondari. Se consideriamo uno spazio dei nomi come una funzione come se avessimo uno spazio dei nomi che pubblicizza nello spazio dei nomi di marketing, utilizziamo marketing.advertising.adsclass.adsmethod. Molto facile risolvere un problema. Java ha lo stesso metodo tramite pacchetto ma complesso per i nuovi arrivati.

In C #

'' 'marketing dello spazio dei nomi {

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

     }

}

Da utilizzare nella classe client

using marketing;
using marketing.advertising;

'' 'In Java usi lo stesso metodo. Metti più classi in un unico pacchetto e lo usi molte volte. Aumenta l'unicità. Scrivi una volta e usi molte volte. Classi correlate in un unico pacchetto. Non c'è bisogno di codificare molte volte.


2
La domanda riguarda la differenza tra gli spazi dei nomi in C # e i pacchetti in Java. Questa risposta non affronta affatto questo.
Johan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.