web-dev-qa-db-fra.com

Différence entre les espaces de noms en C # et les packages en Java

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

88
Mazzy

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 sur 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 paquets. Vous devez utiliser l'instruction import ou le nom qualifié 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 contenir qu'une seule déclaration de package.

C #

Les espaces de noms sont utilisés pour organiser les programmes, à la fois comme système d'organisation "interne" pour un programme et comme 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 le namespace, par exemple

using myAlias = System.Security.Crypography; 

puis se référer à la classe avec 

myAlias.AsymmetricAlgorithm 

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

ou

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

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

En Java, la structure de répertoires doit correspondre à la structure du package. No Telle restriction 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 l'accessibilité par défaut/package. L'accessibilité interne en C # vanous dans les assemblys.

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

39
Acaz Souza

Il n’existe pas de terme tel que "espace de nom" en Java - un paquetage agit comme un espace de nom en Java, en termes de portée des noms. Cela fait également partie du modèle d'accessibilité.

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

Les programmes sont organisés en ensembles de packages. Chaque paquet 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 #, à ceci près qu'il a un impact sur l'accessibilité, alors qu'en C #, les espaces de noms et l'accessibilité sont entièrement orthogonaux.

31
Jon Skeet

En C++/C #, les espaces de noms ne sont utilisés que 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: des packages sont utilisés pour les modules, le nommage n’en est qu’une partie.

11
kba

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.

Ces types de spécificateurs d'accès ne sont pas applicables aux espaces de noms dans c sharp

0
dasumohan89