Diferencia entre el espacio de nombres en C # y el paquete en Java

98

¿Cuál es la diferencia (en términos de uso) entre los espacios de nombres en C # y los paquetes en Java?

Mazzy
fuente

Respuestas:

74

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


Java

Los paquetes se utilizan para organizar archivos o tipos públicos para evitar conflictos de tipos. Las construcciones de paquetes se pueden asignar a un sistema de archivos.

system.security.cryptography.AsymmetricAlgorithm aa;

puede ser reemplazado:

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

No hay alias para los paquetes. Debe usar una declaración de importación o un nombre completo para mencionar el tipo específico.

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

o

package n1.n2;
   class A {}

Otro archivo fuente:

package n1.n2;
   class B {}

El paquete no se puede anidar. Un archivo fuente solo puede tener una declaración de paquete.

C#

Los espacios de nombres se utilizan para organizar programas, como sistema de organización "interno" para un programa y como sistema de organización "externo".

System.Security.Cryptography.AsymmetricAlgorithm aa;

puede ser reemplazado:

using System.Security.Crypography; 
AsymmetricAlgorithm aa;

Alternativamente, se podría especificar un alias para el espacio de nombres, p. Ej.

using myAlias = System.Security.Crypography; 

y luego referirse a la clase con

myAlias.AsymmetricAlgorithm 

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

o

namespace N1
{
    namespace N2
    {
        class A {}
        class B {}
    }
}
RuudVanNistelrooy
fuente
3
gran respuesta, pero la importación de Java no funcionará, creo. Debería serlo import system.security.crypography.AsymmetricAlgorithm;. Dado que en Java tienes que importar una clase, no un paquete. Es posible importar todas las clases en un paquete con un import package.*pero eso también importa las clases, no el paquete.
Imus
¿Hay alguna forma de espacio de nombres en Java sin usar tantas carpetas? Una namespacepalabra clave en Java estaría bien.
42

Hay algunos detalles que difieren.

En Java, la estructura del directorio debe coincidir con la estructura del paquete. No existe tal restricción en C #.

En C #, puede tener varios espacios de nombres en un archivo. En Java, un archivo pertenece a un paquete (ver anterior).

Java tiene accesibilidad predeterminada / paquete. La accesibilidad interna de C # se incluye en ensamblados.

Si usa VS y Eclipse y les permite estructurar el proyecto, no sentirá mucho las diferencias.

Acaz Souza
fuente
35

No existe un término como "espacio de nombres" en Java; sin embargo, un paquete actúa como un espacio de nombres en Java, en términos de proporcionar un ámbito para los nombres. También forma parte del modelo de accesibilidad.

De la sección 7 de la Especificación del lenguaje Java :

Los programas están organizados como conjuntos de paquetes. Cada paquete tiene su propio conjunto de nombres para tipos, lo que ayuda a evitar conflictos de nombres. Un tipo de nivel superior es accesible (§6.6) fuera del paquete que lo declara solo si el tipo se declara público.

EDITAR: De acuerdo, después de la aclaración: un paquete de Java es similar a un espacio de nombres C #, excepto que tiene un impacto en la accesibilidad, mientras que en C # los espacios de nombres y la accesibilidad son completamente ortogonales.

Jon Skeet
fuente
12

En C ++ / C #, los espacios de nombres solo se usan para particionar nombres para evitar colisiones al usar accidentalmente el mismo nombre para una variable en diferentes lugares.

En Java, los paquetes son mucho más que eso: los paquetes se utilizan para módulos, el aspecto de la denominación es solo una parte.

kba
fuente
0

En Java, puede aplicar varios especificadores de acceso a las clases que tendrán un impacto en sus paquetes.

protegido: accesible para el mismo paquete y sus subclases en otro paquete, predeterminado: accesible para el mismo paquete, público: universalmente accesible, privado: ni siquiera accesible por el mismo paquete.

Este tipo de especificadores de acceso no son aplicables al espacio de nombres en c sostenido

dasumohan89
fuente
-2

Un espacio de nombres es como una carpeta nueva, todas las subcarpetas son sub-espacios de nombres. Si consideramos un espacio de nombres como una función como si tuviéramos un espacio de nombres publicitario bajo el espacio de nombres de marketing, usamos marketing.advertising.adsclass.adsmethod. Muy fácil de resolver un problema. Java tiene el mismo método a través del paquete, pero es complejo para los recién llegados.

C ª#

'' 'marketing de espacio de nombres {

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

     }

}

Para usar en clase de cliente

using marketing;
using marketing.advertising;

'' 'En Java usas el mismo método. Empaqueta varias clases en un paquete y lo usa muchas veces. Aumenta la singularidad. Escribes una vez y usas muchas veces. Clases relacionadas en un paquete. No es necesario codificar muchas veces.

Rashid Irshad
fuente
2
La pregunta es sobre la diferencia entre los espacios de nombres en C # y los paquetes en Java. Esta respuesta no aborda esto en absoluto.
Johan