2012-01-26 27 views
14

Lo siento si esta pregunta ya se realizó. Empecé a estudiar C# y noté que C# no importa espacios de nombres anidados automáticamente. que no entiendo:Importación de espacios de nombres anidados automáticamente en C#

using System; 

debe importar de forma automática todas las clases contenidas en el espacio de nombres System derecha? Así que no debería haber ninguna necesidad para mí escribir

using System.Windows.Form; 

lo entendería si using Windows.Form incluso trabajó. ¡Pero el compilador no pudo resolverlo! ¿Cuál es el objetivo del using System; antes que él? Entonces, ¿por qué using System; no importa System.Windows automáticamente así como System.Windows.Forms? Lo siento si la palabra "importación" está equivocada aquí ... tal vez mover al espacio de nombres global es la terminología correcta.

+3

C# no funciona así, en Java puede importar espacios de nombres con comodines, pero por alguna razón los diseñadores de C# eligieron no hacerlo. No estoy seguro de que sea constructivo debatir por qué. – CodingGorilla

+2

Closters: esta es una pregunta legítima. – Oded

+1

@CodingGorilla: El "por qué" no es un debate; existe una razón clara (es decir, como dijo Oded, que los espacios de nombres C# son lógicos, no grupos físicos). – Brian

Respuesta

18

C# no es Java.

A using directive se utiliza para que no tenga que escribir el nombre totalmente calificado de un tipo. También ayuda con la desambiguación de nombres de tipo (utilizando alias, por ejemplo). En el caso de Console, por ejemplo, no necesita escribir System.Console.

Es importante entender la diferencia entre un espacio de nombre y un conjunto: un espacio de nombres es agrupación lógica de tipos. Un ensamblaje es agrupación física de tipos. Los espacios de nombre pueden abarcar ensamblajes.

Cuando referencia un conjunto (esto es más como la importación de un paquete en Java), tendrá acceso a todos los de los tipos públicos en el mismo. Para usar un tipo, necesitas identificarlo de manera única. Esto se hace a través del espacio de nombres: la directiva using simplemente significa que no tiene que escribir el nombre completo del tipo.

+0

Entonces el uso importará todas las clases en el espacio de nombres actual, pero cuando golpea un espacio de nombres anidado lo ignora? A menos que lo especifique explícitamente ... ¿ese es el punto? –

+0

@LewsTherin - No es "ignorarlo".Simplemente no especificó el "acceso directo". Las directivas 'using' se usan para que no tenga que especificar la" ruta "completa al tipo. Puede acceder al tipo usando la ruta completa si lo desea, pero tener las instrucciones 'using' solo asegura que no tenga que escribir tanto ... – Oded

+0

Agregar una referencia a un ensamblado significa" cargar todos los tipos de este ensamblaje " al predeterminado AppDomain ", por medio de la directiva' using', simplemente le dice a su código qué tipos son _visible_ en este momento. – Restuta

11

La directiva using tiene dos usos:

para permitir el uso de tipos en un espacio de nombres para que no tenga que califica el uso de un tipo en ese espacio de nombres:

usando System.Text;

Para crear un alias para un espacio de nombres o un tipo. Esta se denomina directiva de uso de alias.

usando Project = PC.MyCompany.Project;

http://msdn.microsoft.com/en-us/library/sf0df423.aspx

Sin embargo, usted tiene que señalar que el Sistema de System.Windows.Form y no están conectados a través del nombre propio de todos modos. Si importa (usa) Sistema, significa que usará los tipos de ensamblaje del Sistema en esta clase. Referencia real que especifica en la sección de referencias en el proyecto de Visual Studio que realmente puede usar (incluso sin usar instrucción, ya que esto es solo un acceso directo para los tipos).

+0

+1. Buen punto: C# permite que los espacios de nombres se dividan en ensamblajes, por lo que es posible que su proyecto no haya importado (o desee importar) los otros ensamblajes. – TrueWill

+0

Me acabo de dar cuenta de lo confundido que estoy. sigo confundiendo con la importación? Y supongo que deben ser cosas diferentes ... ¿C# no importa clases en absoluto? Sé que C++ y Java lo hacen ... –

+1

@LewsTherin - En .NET agrega una _reference_ a un ensamblado que contiene los tipos que desea "importar". – Oded

4

C# no importa espacios de nombres anidados y esto es por diseño.

El ámbito del espacio de nombres le permite organizar el código y le ofrece una manera de crear tipos únicos a nivel mundial.

Los espacios de nombres anidados se utilizan para agrupar la funcionalidad relacionada, pero utilizan partes de ella a pedido.

Supongo que no querrá tener todos los tipos de un espacio de nombre tan grande como System si lo único que necesita es System.Windows.

Así que probablemente la pregunta es por qué C# no tiene algo así como using System.*; como lo hace Java. No sé la respuesta, pero creo que esto se debe al principio de KISS. Es algo así como el uso de

select *

que nunca se sabe qué tipo va a agregar y cómo afectarán el código existente.

1

Incluso en Java que tendría que escribir explícitamente

import System.*; 

Gran parte del tiempo que hace que no quieren todos los espacios de nombres anidados. Estos simplemente desordenarían IntelliSense.

0

"Usar" un espacio de nombres determinado significa que obtendrá acceso a todas las definiciones implementadas directamente en él, no que buscará recursivamente los espacios de nombres incrustados; De lo contrario, se frustraría el propósito de la declaración de "Uso".

Existen espacios de nombres para evitar la ambigüedad del nombre de clase. La instrucción "Uso" está aquí para evitar el uso de tipos totalmente calificados anidados en espacios de nombres, cuando usted sabe que no puede haber (o poco) ambigüedad.

1

La sintaxis "using" le permite acceso abreviado a los espacios de nombres que ya figuran como referencias en la configuración del proyecto. Si el espacio de nombres aparece como referencia, ya tiene acceso a él por su nombre completo sin la directiva "using". Simplemente guarda las pulsaciones de teclas.

0

No, así no es como funciona.

Y voy a dar un buen argumento en contra de lo que dijiste: intellisnse se volvería loco y encontrar lo que quieres sería un infierno.

Tiene acceso a todo en cada espacio de nombres disponible (con puntos), la palabra clave using simplifica esto porque no tiene que especificar desde qué espacio de nombres proviene una clase o estructura (es decir, definida) .

+0

No basaría una característica en su elección de editor (p. Ej .: uno con intellisense). Diseñaría una característica teniendo en cuenta solo a los editores más simples (por ejemplo: notepad.exe). –

+0

Para evitar depender de los editores, puedo hacer un argumento similar para compilador (es): la compilación sería mucho más difícil porque para todo lo que utiliza no está definido localmente, debería verificar cada subárbol posible de cada módulo tu usas. Más allá de lo difícil y derrochador, esto podría causar una gran cantidad de colisiones de nombres. –

Cuestiones relacionadas