program - namespace c# que es
¿System.Collections es un "espacio de nombres del espacio de nombres del sistema"? (4)
De acuerdo, entonces he estado leyendo un libro en C # y .NET, y mientras aprendía sobre la estructura DateTime y el siguiente código:
DateTime dt = new DateTime(2015, 10, 17);
Me pregunté a mí mismo "¿por qué no tuve que hacer referencia a él en la parte superior escribiendo using System.DateTime
"?
Entonces me di cuenta que dado que DateTime es una estructura, y la palabra clave "using" se utiliza para hacer referencia a tipos (type es un término general para referirse a un miembro del conjunto {class, interface, structure, enumeration, delegate}), definido en un espacio de nombre particular (en este caso, DateTime es de tipo estructura desde el espacio de nombres del sistema).
Pero noté que en la parte superior de mi archivo, se encuentran las siguientes directivas de uso (se colocaron allí automáticamente cuando creé mi aplicación de consola C #):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
Me preguntaba por qué las directivas de uso que siguen using System
eran necesarias, ¿cuándo no están todas bajo el espacio de nombres del Sistema y por lo tanto ya deberían estar referenciadas?
Así que supongo que es porque todos los que se declaran a continuación son espacios de nombres , a diferencia de un tipo del conjunto {clase, interfaz, estructura, enumeración, delegado}. Pero sería incorrecto referirse a ellos como "espacios de nombres OF (o pertenecientes a) el sistema de espacio de nombres" y, de ser así, ¿cuál es la razón por la que debe referenciar explícitamente espacios de nombres de un espacio de nombres en lugar de incluirlos implícitamente en using System
?
Espero que mi pregunta sea clara, pero si no, avíseme para poder editarla.
Cree una directiva using para usar los tipos en un espacio de nombres sin tener que especificar el espacio de nombres. Una directiva de uso no le da acceso a espacios de nombres que están anidados en el espacio de nombre que especifique.
de https://msdn.microsoft.com/en-us/library/sf0df423.aspx
Lo mismo sucede cuando se me asignan espacios de nombres como causa de la estructura de mi carpeta como projectName / Code / DBFiles si lo hago usando Code; en uno de mis controladores no me da clases de acceso en DBFiles, es por eso que establezco todos mis espacios de nombres de clase en el espacio de nombres raíz.
Internamente, todos los tipos de .net siempre tienen nombres de tipos completos;
System.DateTime
System.Collections.Generic.Dictionary<string, int>
System.Threading.Tasks.Task
lo que los ''usos'' hacen es dejar que se refiera ''invisiblemente'' a todo antes de un ''.'' personaje. Entonces cuando escribes
DateTime
C # intentará
System.DateTime
System.Collections.Generic.DateTime
System.Linq.DateTime
System.Text.DateTime
etc...
Como solo existe una ( System.DateTime
) es una coincidencia inequívoca, y C # sabe de lo que está hablando.
Si hubiera dos coincidencias, obtendría un error de compilación sobre la ambigüedad. Entonces, si hubiera un System.Threading.Task.DateTime
, su programa no compilaría.
Todo esto establece el escenario para la respuesta a su pregunta. Si
using System;
incluido todo lo que está debajo, entonces sería difícil asegurar que las cosas no sean ambiguas. Por ejemplo, si quisiera diferenciar entre dos clases teóricas
System.WebPages.Button
System.Desktop.Button
luego, un viejo y simple using System
no funcionaría bien con el new Button()
.
La razón es que si no fuera así, no podrías evitar las colisiones de nombres no deseados en determinadas circunstancias. Por ejemplo, si tuviera un espacio de nombres tipo Baz
in Foo
y un espacio de nombres tipo Baz
en Foo.Bar
, siempre tendría que calificar completamente sus tipos, por ejemplo, Foo.Baz
o Foo.Bar.Baz
, en su código, que haría las directivas de using
sin sentido.
Dado el camino, solo tiene que lidiar con colisiones de nombres si realmente tiene instrucciones para ambos espacios de nombres que contienen su tipo.
No necesita tener otras directivas de uso, por ejemplo, si desea una Lista, puede declararla en su código:
System.Collections.Generic.List<String> listOfStrings = new System.Collections.Generic.List<String>;
Para crear una nueva lista, pero la instrucción using le permite simplemente declararla como:
List<String> listOfStrings = new List<String>;
La razón por la que no puedes hacer esto último solo con:
using System;
Es porque podría haber una clase en el Sistema llamada Lista, así como la clase Lista en System.Collections.Generic. Si es así, cuando crea un nuevo objeto de lista, ¿cómo sabe a qué clase de lista se refiere?
Así que, esencialmente, se usan para evitar conflictos de nombres y para permitir que los programadores agrupen elementos en grupos con nombres lógicos, por ejemplo, las clases relacionadas con entrada y salida se pueden encontrar en System.IO