2010-09-14 5 views
13

Cuando se trata de using declaraciones en C# (que no debe confundirse con usingdirectivas que importar los espacios de nombres), Visual Studio no código de una sola línea no guión que sigue, si no hay apoyos estan empleados. Esto es típico de las declaraciones de "anidamiento" que se muestran en this SO question.Formateo/sangría para el uso de declaraciones (C#)

me resulta confuso que las declaraciones posteriores tras using no son sangría, a diferencia del formato de una instrucción if:

// non-indented using statement 
using (var myResource = new SomeIDisposableResource()) 
myResource.Indent(false); 

// indented if statement 
if (something == true) 
    IndentMe(); 

¿Hay alguna razón no para sangrar, o es sólo preferencia?

// indented using statement, but not the default VS formatting 
using (var myResource = new SomeIDisposableResource()) 
    myResource.Indent(); 

EDIT:

La prueba adicional revela que era incorrecta sobre algunos de los comportamientos formato VS. Si se escribe una instrucción using:

using (var myResource = SomeIDisposableResource()) 

... y pulsa enter, el cursor se alineará con using. Si la siguiente línea también es una instrucción de uso, continuará alineándose. Si no lo es, VS lo sangrará al finalizar. Por lo tanto, mi pregunta original está algo invalidada, porque mi primer ejemplo no se puede lograr a menos que anule el formato predeterminado o use un IDE que no lo haga.

Aún así, vale la pena saber que múltiples instrucciones using se tratan mejor como un solo bloque porque técnicamente lo son. La falta de sangría solo se aplica cuando las declaraciones son secuencial using declaraciones sin llaves; y a medida que uno se acostumbra, dejan de parecer tan inusual.

Como siempre, gracias a todos los que respondieron por su conocimiento y experiencia incluso en estos pequeños detalles de programación.

+0

No lo entiendo. ¿Puedes mostrar ejemplos de ambos estilos? La pregunta a la que vinculó muestra un código sangrado ... con curlies ... –

+0

@Martinho Fernandes: ejemplos agregados según lo solicitado. – JYelton

+1

Funciona bien en mi máquina, sangra tan pronto como escribo; Sin embargo, anulé la configuración predeterminada. –

Respuesta

23

Como han dicho otros, siempre use llaves. Sin embargo, hay una modismo, que algo va en contra de este y utiliza el "no-sangría":

using (Resource1 res1 = new Resource1()) 
using (Resource2 res2 = new Resource2()) 
using (Resource3 res3 = new Resource3()) 
{ 
    // Do stuff with res1, res2 and res3 
} 

Pero yo siempre utilizar llaves para el bloque más interno :)

+0

Buena llamada, me olvidé de múltiples instrucciones de uso una encima de la otra. – kemiller2002

+0

La pila de instrucciones de uso parece ir en contra de mi modelo de dependencias de código. Con eso, quiero decir que considero que el código sangrado depende del bloque precedente con una sangría menos. Insertar algún código entre las instrucciones de uso parecería correcto basándose únicamente en el formato, pero a menos que me equivoque, rompería la asociación entre las declaraciones. ¿Supongo que esta es solo una de las excepciones ocasionales a la regla? – JYelton

+0

Si está insertando código entre dos líneas, presumiblemente está mirando esas líneas. – recursive

13

Es su preferencia. Siempre sangro y coloco los elementos necesarios entre paréntesis

using(var t = new t()) 
{ 
    t.Foo(); 
} 
+0

¿Incluso para líneas individuales? Supongo que las llaves luego obligan a VS a sangrar según su preferencia. – JYelton

+7

+1 incluso para líneas individuales. – user7116

+2

Sí, incluso lo puse para líneas individuales. Es una preferencia, pero me he encontrado con demasiadas situaciones en las que alguien accidentalmente comenta o elimina algo y una declaración if extiende su control más allá de donde debería. A veces es un gran dolor de cabeza que provoca horas de depuración. Sigo el principio explícitamente claro y mejor seguro que el perdón. – kemiller2002

5

Solución fácil: utilice siempre bloques explícitos, incluso para líneas individuales. ¡Visual Studio sangrará correctamente y, como bonificación, su código será más fácil de mantener!

+0

¿Quiere decir más fácil de mantener porque las llaves afectan el alcance variable? – JYelton

+2

@JYelton, no del todo. Más fácil de mantener porque si luego desea agregar una línea allí o eliminarla para depuración o algo así, las llaves ya están allí, y no se arriesga a olvidarlas y a perder horas depurándolas. –

+0

@Martinho Fernandes: He tenido tales situaciones; definitivamente es una buena razón para usar siempre llaves. – JYelton

0

Al igual que mi C El instructor me dijo hace más de 10 años: Siempre, siempre, siempre use los frenos. Las probabilidades son buenas de que alguien venga (posiblemente incluso usted) y arroje otra línea de código, y luego se pregunte por qué no se está comportando correctamente.

+0

Sí, una buena regla para C, sin embargo, no se aplica a C#. –

+0

¿De verdad? Me ha servido bien desde que salió C# por primera vez. ¿Por qué dirías que no se aplica? – monkeymindllc

0

Me gusta ser votado negativamente cuando me equivoco, así que voy a hacer una respuesta a esto ...

Así es como me gustaría darle formato:

using (Resource1 res1 = new Resource1()) 
using (Resource2 res2 = new Resource2()) 
using (Resource3 res3 = new Resource3()) 
    DoStuffWithResources(res1, res2, res3); 

Si tuviera que sustituir DoStuffWithResources con varias instrucciones, me gustaría hacer aparatos de uso. Sin embargo, mi editor me impide tener que hacer el siguiente error:

using (Resource1 res1 = new Resource1()) 
using (Resource2 res2 = new Resource2()) 
using (Resource3 res3 = new Resource3()) 
    DoStuffWithResources(res1, res2, res3); 
    DoOtherStuffWithResources(res1, res2, res3); 

Cuando trato de entrar en lo anterior, inmediatamente me sale:

using (Resource1 res1 = new Resource1()) 
using (Resource2 res2 = new Resource2()) 
using (Resource3 res3 = new Resource3()) 
    DoStuffWithResources(res1, res2, res3); 
DoOtherStuffWithResources(res1, res2, res3); 

Pro consejo: Un downvote no es un argumento en contra, por lo si no tienes uno, no deberías votar.

+0

Mi argumento para usar llaves no es por lo que * podría hacer *, es la siguiente persona que entra y no confío. Al igual que conducir en un camino nevado en invierno, sé que puedo cuidarme, es el manejo de todos los demás lo que me asusta. Dado el punto, reconocerá que el segundo no tiene sangría, pero ¿qué hay del Jr. que se trajo para hacer el trabajo defectuoso? –

+0

La siguiente persona también está utilizando el editor VS, por lo que lo mismo impide que * them * cree accidentalmente ese segundo bloque de código. Si se encuentra en una tienda típica, el código será revisado antes de ser lanzado o puesto en producción. Como parte de la revisión del código, siempre doy formato al documento para garantizar que no haya cambios. –

+0

@Steven, el código será revisado? ¡Deseo! Si solo el LOB viera tales asuntos tan claramente como lo hacen los programadores. –

Cuestiones relacionadas