2009-08-27 16 views
10

Una cosa que he notado mucho es en donde las instrucciones de uso deben colocarse en un archivo de código C#, ya sea en el ámbito más externo o dentro de un espacio de nombres. Entiendo que la ubicación de la declaración de uso afecta el alcance de las referencias dentro de ese archivo, pero lo que no entiendo es por qué, en la mayoría de los casos, alguien querría siempre que usaran declaraciones dentro de su espacio de nombres.C# - Ubicación del uso de las declaraciones

En casi todos los casos existe una sola declaración de espacio de nombres en un solo archivo, por lo que determinar el alcance de las instrucciones de uso parece/(¿es?) Inútil. Si uno colocaba varios tipos y múltiples espacios de nombres en el mismo archivo, el uso de las sentencias en el ámbito lógico tiene mucho sentido, pero todavía veo muchos casos de esto incluso en archivos con un espacio de nombres. ¿Por qué?

using System; 

namespace MyNamespace 
{ 
    using System.Text; 

    public class MyClass { 
     // ... 
    } 
} 

Un ejemplo de esto se está haciendo a lo largo de un proyecto aparentemente innecesaria es la ASP.NET MVC source.

+1

Esto realmente ha sido golpeado hasta la muerte. El "por qué" está cubierto en esta publicación: http://stackoverflow.com/questions/125319/should-usings-be-inside-or-outside-the-namespace – womp

+0

Su SO-Search-Fu es mayor que mi propio ... No pude encontrar esa publicación cuando busqué algo similar. :) –

+0

Solo para aclarar, esta pregunta es en realidad acerca de [usar la Directiva] (http://msdn.microsoft.com/en-us/library/sf0df423 (v = vs.110) .aspx) y no del [uso Declaración] (http://msdn.microsoft.com/en-us/library/yh598w02 (v = vs.110) .aspx). – mwardm

Respuesta

12

Poner "usar" en la parte superior de los archivos es la forma predeterminada de Visual Studio. Sin embargo, el enfoque recomendado es colocar las instrucciones de "uso" dentro del espacio de nombres. Incluso el estilo de MS detecta esto y dice que la forma predeterminada de VS es incorrecta.

Ambas técnicas funcionan bien.

Regla StyleCop dice: la colocación de múltiples elementos de espacio de nombres dentro de un solo archivo es generalmente una mala idea , pero si y cuando esto se hace , es una buena idea poner todos los utilizando directivas dentro de cada uno de los elementos de espacio de nombres , en lugar de globalmente en la parte superior del archivo. Este abarcará los espacios de nombres estrechamente, y también ayudará a evitar el tipo de comportamiento descrito anteriormente.

Es importante señalar que cuando el código ha sido escrito con el uso de directivas colocados fuera del espacio de nombres, el cuidado se deben tomar cuando se mueve estos directivas dentro del espacio de nombres, a asegurarse de que esto no está cambiando la semántica del código. Como se explica más arriba , colocando utilizando-alias directivas dentro del elemento de espacio de nombres permite el compilador que elegir entre tipos conflictivos en formas que no sucede cuando las directivas son colocado fuera del espacio de nombres.

Aquí hay algunos enlaces para una revisión adicional:

+6

Lo siento, pero esto está completamente mal. Para empezar, las directivas 'using' no hacen referencia a _assemblies_ - ¡importan _namespaces_! Por ejemplo, 'namespace System' está presente en los ensamblados' mscorlib.dll', 'System.dll' y' System.Core.dll'. Además, las directivas '' using' de C# no tienen ningún efecto en la salida de MSIL, porque MSIL siempre tiene todos los nombres de tipos, y no existe ningún concepto de "espacio de nombres" en el nivel de MSIL. Los efectos observados en la publicación de Scott probablemente tienen que ver con cómo _VS debugger_ maneja la carga de ensamblajes cuando tiene el código fuente. –

+4

Ahh, de hecho, ahora que leí cuidadosamente la publicación del blog de Scott, en realidad está _debunking_ el reclamo. Específicamente, dice: "Si hago lo mismo con los usos DENTRO del espacio de nombres, obtengo resultados idénticos ... Estoy 99.99% seguro en este punto de que el uso de directivas no puede cambiar el comportamiento de carga de ensamblaje y creo que estaba derecho a ser sospechoso. " –

+1

Vaya, mal presupuesto ... lo actualicé. –

0

editado, con la cabeza colgando en la vergüenza

Ahh! La instrucción using a la que se refiere se utiliza para importar un espacio de nombres, ¡no para envolver un objeto IDisposable!

términos muy diferentes, ambiguas ... que me había confundido :-)

Personalmente me gustan fuera del espacio de nombres en la parte superior del archivo; pero probablemente se deba a que cambio entre C# y VB.NET.

Me gusta organizar mis proyectos en 1 archivo por clase, sin clases internas (anidadas) y solo una clase por espacio de nombres (por archivo). En esta situación, la ubicación de la declaración using es irrelevante ya sea dentro o fuera del espacio de nombres.


El iDesignC# coding standard es una norma sólida para seguir (o para derivar a partir de su propio). Se recomienda mantener las declaraciones using fuera del espacio de nombres como elemento # 14. Pero todo se reduce a la convención de su empresa/proyecto

+0

A eso no se refiere. – womp

+4

"solo una clase por espacio de nombres" - ¿En serio? – grenade

+0

Eso me hizo reír cuando lo leí también. : D –

3

que nunca había siquiera visto/oído hablar de esta práctica hasta Empecé usin g StyleCop y sería marcado por rule SA1200, que ahora solo deshabilito. Es extraño que los archivos .cs que Visual Studio crea como parte de un nuevo proyecto violen esta regla al colocar las directivas using al principio del archivo, fuera del espacio de nombres.

Cuestiones relacionadas