Différence entre l'espace de noms en C # et le package en Java

98

Quelle est la différence (en termes d'utilisation) entre les espaces de noms en C # et les packages en Java?

Mazzy
la source

Réponses:

74

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


Java

Les packages sont utilisés pour organiser les fichiers ou les types publics afin d'éviter les conflits de types. Les constructions de package peuvent être mappées à un système de fichiers.

system.security.cryptography.AsymmetricAlgorithm aa;

peut être remplacé:

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

Il n'y a pas d'alias pour les packages. Vous devez utiliser une instruction d'importation ou un nom complet pour mentionner le type spécifique.

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

ou

package n1.n2;
   class A {}

Un autre fichier source:

package n1.n2;
   class B {}

Le package ne peut pas être imbriqué. Un fichier source ne peut avoir qu'une seule instruction de package.

C #

Les espaces de noms sont utilisés pour organiser les programmes, à la fois en tant que système d'organisation "interne" pour un programme et en tant que système d'organisation "externe".

System.Security.Cryptography.AsymmetricAlgorithm aa;

peut être remplacé:

using System.Security.Crypography; 
AsymmetricAlgorithm aa;

Alternativement, on pourrait spécifier un alias pour l'espace de noms, par exemple

using myAlias = System.Security.Crypography; 

puis référez-vous à la classe avec

myAlias.AsymmetricAlgorithm 

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

ou

namespace N1
{
    namespace N2
    {
        class A {}
        class B {}
    }
}
RuudVanNistelrooy
la source
3
excellente réponse mais l'importation java ne fonctionnera pas, je pense. Ça devrait être import system.security.crypography.AsymmetricAlgorithm;. Depuis java, vous devez importer une classe, pas un package. Il est possible d'importer toutes les classes dans un package avec un import package.*mais cela aussi importe les classes, pas le package.
Imus
existe-t-il un moyen de créer un espace de noms en Java sans utiliser autant de dossiers? Un namespacemot clé en Java serait bien.
42

Il y a quelques détails qui diffèrent.

En Java, la structure des répertoires doit correspondre à la structure du package. Aucune restriction de ce type en C #.

En C #, vous pouvez avoir plusieurs espaces de noms dans un seul fichier. En Java, un fichier appartient à un package (voir ci-dessus).

Java a une accessibilité par défaut / package. L'accessibilité interne C # va dans les assemblys.

Si vous utilisez VS et Eclipse et que vous les laissez structurer le projet, vous ne ressentirez pas beaucoup les différences.

Acaz Souza
la source
35

Il n'y a pas de terme tel que «espace de noms» en Java - un package agit comme un espace de noms en Java, en termes de fourniture d'une portée pour les noms. Cela fait également partie du modèle d'accessibilité.

De la section 7 de la spécification du langage Java :

Les programmes sont organisés en ensembles de packages. Chaque package a son propre ensemble de noms pour les types, ce qui permet d'éviter les conflits de noms. Un type de niveau supérieur est accessible (§6.6) en dehors du package qui le déclare uniquement si le type est déclaré public.

EDIT: D'accord, après la clarification: un package Java est similaire à un espace de noms C # - sauf qu'il a un impact sur l'accessibilité, alors qu'en C # les espaces de noms et l'accessibilité sont entièrement orthogonaux.

Jon Skeet
la source
12

En C ++ / C #, les espaces de noms sont simplement utilisés pour partitionner les noms afin d'éviter les collisions en utilisant accidentellement le même nom pour une variable à différents endroits.

En Java, les packages sont bien plus que cela - les packages sont utilisés pour les modules, l'aspect de dénomination n'en est qu'une partie.

kba
la source
0

En java, vous pouvez appliquer divers spécificateurs d'accès aux classes qui auront un impact sur vos packages.

protected: accessible au même package et à ses sous-classes dans un autre package, par défaut: accessible au même package, public: universellement accessible, private: même pas accessible par le même package.

Ces types de spécificateurs d'accès ne s'appliquent pas à l'espace de noms dans c sharp

dasumohan89
la source
-2

Un espace de noms est comme un nouveau dossier, tous les sous-dossiers sont des sous-espaces de noms. Si nous considérons un espace de noms comme une fonction comme nous avons un espace de noms publicitaire sous l'espace de noms marketing, nous utilisons marketing.advertising.adsclass.adsmethod. Très facile à résoudre un problème. Java a la même méthode via package mais complexe pour les nouveaux arrivants.

En C #

'' 'marketing d'espace de noms {

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

     }

}

À utiliser en classe client

using marketing;
using marketing.advertising;

'' 'En java, vous utilisez la même méthode. Vous regroupez plusieurs classes dans un seul package et vous l'utilisez plusieurs fois. Cela augmente l'unicité. Vous écrivez une fois et utilisez plusieurs fois. Classes associées dans un seul package. Pas besoin de coder plusieurs fois.

Rashid Irshad
la source
2
La question concerne la différence entre les espaces de noms en C # et les packages en Java. Cette réponse ne traite pas du tout de cela.
Johan