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

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

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


Java

Los paquetes se usan para organizar archivos o tipos públicos para evitar conflictos de tipo. 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 paquetes. Debe usar instrucción de importación o 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 puede ser nested. Un archivo fuente solo puede tener una statement de paquete.

DO#

Los espacios de nombres se usan para organizar progtwigs, como un sistema de organización “interna” para un progtwig y como un sistema de organización “externo”.

 System.Security.Cryptography.AsymmetricAlgorithm aa; 

puede ser reemplazado:

 using System.Security.Crypography; AsymmetricAlgorithm aa; 

Alternativamente, uno podría especificar un alias para el espacio de nombres, por ejemplo

 using myAlias = System.Security.Crypography; 

y luego refiérase a la clase con

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

o

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

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 múltiples espacios de nombres en un archivo. En Java, un archivo pertenece a un paquete (ver anterior).

Java tiene acceso por defecto / paquete. La accesibilidad interna de C # va en ensamblajes.

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

No existe el término “espacio de nombres” en Java, aunque un paquete actúa como un espacio de nombres en Java, en términos de proporcionar un scope para los nombres. También es parte del modelo de accesibilidad.

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

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

EDITAR: Bien, después de la aclaración: un paquete 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.

En C ++ / C #, los espacios de nombres se usan solo 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 usan para los módulos, el aspecto de los nombres es solo una parte de ellos.

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

protected: accesible para el mismo paquete y para 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 sharp