2012-08-28 21 views
25

Pregunta rápida y simple. Entiendo bastante bien qué hace el calificador Namespace Alias, 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.C# Espacio de nombres Alias ​​calificador (: :) vs Desreferencia Operador (.)

using colAlias = System.Collections; 

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

+1 Solo porque he estado programando en C# durante algunos años y nunca he visto este operador en ningún lado. : D – Tudor

+0

@Tudor La misma situación aquí :) Muy raramente visto, pero lo encontré hoy y quería aprender más. –

Respuesta

11

Este es un caso de esquina :: (como el prefijo @) está allí para ocuparse de las ocurrencias bastante raras donde un nombre entra en conflicto entre espacios de nombres, clases y palabras clave.

:: solo funciona para espacios de nombres (y alias de espacio de nombres), mientras que .. funciona tanto para espacios de nombres como para subclases. En la mayoría de los lugares donde lo necesitarías, sería mejor usar 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 en 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 usa el espacio de nombres YourCompany.Application. Ahora uno de sus clientes (utilizando su autogeneración) 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 solucionar este código de generación con global::YourCompany.Application, los que usan su autogenerador pueden usar cualquier espacio de nombre que quieran y no entrar en conflicto.

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

+0

_Pensé que Microsoft agregó global :: porque ..._ No exactamente: "Es posible que tenga que hacer referencia a dos versiones de ensamblados que tienen los mismos nombres de tipo totalmente calificados" –

2

Hay un MSDN page explicar cómo funciona esto.

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

No utilizaría el operador :: en nada que no sea el espacio de nombre global, y aun así hay formas más que suficientes para evitarlo.

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

0

El calificador de alias del espacio de nombres (: :) le ayuda a acceder a los métodos del espacio de nombres sin causar errores si tiene CONFLICTO de espacios de nombres que utilizan 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

+0

Bueno, gracias por la respuesta, pero me di cuenta mucho de eso, lea mi descripción. Lo que quería saber eran las diferencias, y por ejemplo, por qué no se podía usar el operador de desreferenciación para acceder al espacio de nombres global ... por qué se usaría uno sobre el otro ... –

+1

@FranciscoAguilera Supongamos que tiene el suyo Clase del sistema En este caso, ¿cómo usarías el operador de desreferenciación para acceder a System.Console.WriteLine si quisieras? Así que usa el calificador de alias del espacio de nombres para acceder al espacio de nombres global ( global :: System.Console.WriteLine()) para evitar el conflicto. – TWickz

1

La idea general de un partido de clasificación espacio de nombres es permitir que se hace referencia el espacio de nombres, incluso si el nombre ha sido utilizado en otros lugares. Si declaraste una clase llamada "colAlias", entonces 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 limitado y global:: es el único caso de uso típico que he visto para este operador (cuando se intenta garantizar que no haya conflictos al crear código generado para compilar en una aplicación desconocida).

6

Usted dijo:

Espacio de nombres de alias calificador hace, es para tener acceso a los miembros en un espacio de nombres, sin embargo, también lo hace el operador de desreferencia.

Bueno, no. El operador . se usa para acceder a cualquier miembro, incluidas las funciones. Usted no puede hacer Console::WriteLine();

:: es sólo para resolver los espacios de nombres, ya sea desde un alias de espacio de nombres de la siguiente manera:

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

O de lo global.

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

Usted no puede hacer:

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

PERO, si usted tiene un alias el operador . también trabaja, por lo en su caso, no hay ninguna diferencia.

+0

¿Esto significa que el operador '.' puede hacer todo lo que puede hacer el operador' :: 'y más, excepto para hacer referencia al espacio de nombres global? – j00hi

Cuestiones relacionadas