namespace invalid code c# namespaces global dereference

invalid - using namespace c#



C#Namespace Alias qualifier(::) vs Dereferencing Operator(.) (5)

Pregunta rápida y sencilla. Entiendo lo que hace el calificador de Alias ​​del espacio de nombres, es para acceder a los miembros en un espacio de nombres, sin embargo, también lo hace el operador de desreferenciación. Estoy realmente desconcertado en cuanto a la diferencia en esta situación, por qué usaría uno sobre el otro, o cómo cada uno logra lo mismo.

using colAlias = System.Collections; namespace myns { class TestApp { static void Main() { colAlias.Hashtable test = new colAlias.Hashtable(); colAlias::Hashtable test1 = new colAlias::Hashtable(); } } }


El calificador de alias de espacio de nombres (: :) le ayuda a acceder a los métodos de espacio de nombres sin causar errores si tiene CONFLICTOS de espacios de nombres usando la misma convención de nomenclatura.

Por ejemplo, como se explica aquí en msdn http://msdn.microsoft.com/en-us/library/c3ay4x3d(v=vs.80).aspx


Este es un caso de esquina :: (como el prefijo @ ) está ahí para hacer frente a los casos bastante raros donde un nombre entra en conflicto entre espacios de nombres, clases y palabras clave.

:: solo funciona para espacios de nombres (y alias de espacios de nombres), mientras que . . Funciona para ambos espacios de nombres y subclases. La mayoría de los lugares donde lo necesitarías sería mejor que utilices un nombre diferente, pero eso no siempre es una opción.

global:: es un caso especial que se ve con mayor frecuencia en el código generado automáticamente: restablece el espacio de nombres al que se hace referencia a la raíz.

Por ejemplo, supongamos que genera automáticamente algún código (tal vez para una aplicación de formularios, EF o similar) y su aplicación utiliza el espacio de nombres YourCompany.Application . Ahora, uno de sus clientes (utilizando su generación automática) decide agregar su propio espacio de nombres en su aplicación TheirCompany.YourCompany.Application . Ahora todo su código automático falla porque cuando compila .Net no sabe si usar su espacio de nombres o el de ellos.

Para corregir este código de generación con global::YourCompany.Application , entonces aquellos que usan su generador automático pueden usar cualquier espacio de nombres que deseen y no generar conflictos.

Creo que Microsoft agregó global:: porque esperaban que algunos clientes de .Net agregaran espacios de nombres como System .


Hay una página de MSDN que explica cómo funciona esto.

Básicamente, en su situación, lograrán lo mismo y, para facilitar la lectura del código, se prefiere usar uno solo . .

No usaría el operador :: en nada que no fuera el espacio de nombres global, e incluso entonces hay formas más que suficientes para solucionarlo.

edición: Más información sobre lo que hace el operador se explica en el artículo :: Operator (C # Reference) .


La idea general de un calificador de espacio de nombres es permitirle hacer referencia al espacio de nombres incluso si el nombre se ha utilizado en otro lugar. Si declara una clase llamada "colAlias", colAlias.Hashtable haría referencia a la clase, pero colAlias ​​:: Hashtable haría referencia al valor del espacio de nombres.

Este es un caso de uso bastante estrecho y global:: es el único caso de uso típico que he visto para este operador (cuando intento asegurar que no se produzcan conflictos al crear el código generado para compilarlo en una aplicación desconocida).


Tu dijiste:

El calificador de alias del espacio de nombres lo hace, es para acceder a los miembros en un espacio de nombres , pero también lo hace el operador de anulación de referencias.

Bueno no. El . El operador se utiliza para acceder a cualquier miembro, incluidas las funciones. No puedes hacer Console::WriteLine();

:: es solo para resolver espacios de nombres, ya sea desde un alias de espacio de nombres como este:

using colAlias = System.Collections; ... ... colAlias::Hashtable test = new colAlias::Hashtable();

O de lo global.

global::System.Console.WriteLine(..);

No puedes hacer

System.Collections::ArrayList a = new System.Collections.ArrayList();

PERO, si tienes un alias el . El operador también trabaja, por lo que en su caso , no hay diferencia.