2009-10-10 16 views
8

Por lo que entiendo, el calificador global:: le permite acceder a un espacio de nombres que ha sido ocultado por otro con el mismo nombre. El MSDN page usa System como ejemplo. Si crea su propio espacio de nombre System, puede alcanzar el original con global::System. Lo primero que me vino a la mente es, ¿por qué alguien llamaría a su espacio de nombres System? La página continúa diciendo que esto obviamente no es recomendable, pero la duplicación del espacio de nombres es muy posible en proyectos grandes. Si/cuando esto ocurre, ¿es una señal de que las cosas van en la dirección incorrecta, o hay razones válidas para tener espacios de nombres en conflicto?El uso de global :: para espacios de nombres conflictivos

+0

¿Hay buenos olores de código? : p –

+0

@rpflo: Tal vez quiere decir "¿es este un olor de código severo?" –

+1

En contraste con el buen código, que huele a lilas. :) –

Respuesta

7

Una razón legítima para tener espacios de nombres conflictivos podría ser el uso de bibliotecas internas que se escribieron para versiones anteriores de .Net que no contenían la funcionalidad que se agregó en versiones posteriores. En .Net 1.1 días, por ejemplo, escribí una clase de registro que incluía las llamadas de registro API. Por pura casualidad, los nombres de método que elegí eran exactamente los mismos que los de la clase de Registro .Net posterior, e hicieron exactamente las mismas cosas, por lo que fue fácil desenchufar el código de mi propio país. Para cosas más complicadas, podría ser útil poder usar un fragmento de código más antiguo y mal nombrado con el calificador global::.

Nombrar intencionalmente una nueva pieza de código usando un espacio de nombres .Net existente sin duda sería un olor a código.

12

En general, global:: se utiliza para indicar "Quiero comenzar en la parte superior de la estructura del espacio de nombres". Si tengo un espacio de nombres llamado MyProduct.System, todo lo que resida en el espacio de nombres MyProduct no podrá acceder al espacio de nombres Microsoft System. ¿Es un olor a código? Quizás a veces, pero no particularmente maloliente.

7

Cualquier código generado por la máquina debe probar y usar global:: para minimizar el potencial de conflictos de espacio de nombres que puede no tener en cuenta. Además, cualquier código que pueda entrar en conflicto puede usarlo para ser más específico.

0

Creo que sucede de vez en cuando que uno de tus espacios de nombres tiene el nombre de otro. Por ejemplo, tengo un espacio de nombre .Persistence.NHibernate, donde NHibernate también podría ser el espacio de nombres raíz del ensamblado de NHibernate.

no veo ningún código olor aquí, es sólo nombrar isses;)

2

Microsoft tiene unas buenas pautas de espacio de nombres en el libro excelente Framework Design Guidelines 2nd Ed.. En general, recomiendan no introducir conflictos (por ejemplo, al nombrar su tipo Stream).

No creo que haya usado alguna vez el calificador global ::. En general, lo consideraría un olor codificado (aunque hay excepciones, como lo señalan MusiGenesis y las seis variables de la lista).

Cuestiones relacionadas