2012-01-11 9 views
7

Duplicar posible:
When do you use code blocks?¿Beneficios de los bloques de scoping?

Ok, esto podría ser una pregunta estúpida y yo podría estar perdiendo algo obvio, pero mientras poco a poco aprender C# esto me ha mantenido persistente desde hace un tiempo .

El siguiente código compila obviamente muy bien:

public void Foo() 
{ 
    { 
     int i = 1; 
     i++; 
    } 

    { 
     int i = 1; 
     i--; 
    } 
} 

entiendo que {} bloques pueden ser utilizados para determinación del ámbito. La pregunta es por qué querrías hacer esto? ¿Qué problemas resuelve esta característica?

no hay ningún daño que pueda ver en su uso salvo que se le añade un código más confuso, ya que este tipo de alcances pueden ser más fácilmente pasados ​​por alto en comparación a los "atado" a los controles, las iteraciones de flujo, etc.

+0

case statements es donde es realmente útil, por lo que no obtiene errores para reutilizar algo como 'i' en un bucle. – Chad

Respuesta

6

Es útil en switch declaraciones donde sus declaraciones de variables pueden llegar a ser confuso:

código Confundir:

switch (true) 
{ 
    case true: 
     var msg = "This is true."; 
     var copy = msg; 
     break; 

    case false: 
     msg = "This is false."; 
     copy = msg; 
     break; 
} 

código Claro:

switch (true) 
{ 
    case true: 
    { 
     var msg = "This is true."; 
     var copy = msg; 
     break; 
    } 

    case false: 
    { 
     var msg = "This is false."; 
     var copy = msg; 
     break; 
    } 
} 
+0

Más divertido y estúpido cuando la gente usa saltos de línea adicionales, etc. en lugar de solo brazaletes/bloques – abatishchev

+1

¡Gracias! Ja, ja, he estado usándolos, ya que siempre escribo las declaraciones 'switch' de la segunda manera. Lo gracioso y triste de esto es que pensé que en realidad estaba usando "bloques de casos", bloques no anónimos ... aún tengo mucho que aprender: (... – InBetween

1

Para bloques de scopes 'simples' como estos, tendería a estar de acuerdo contigo. Desde una perspectiva de diseño de lenguaje, creo que son una generalización de los bloques de ámbito implícitos en las condiciones for, while y if, donde son más importantes. Por ejemplo:

foreach (var x in foos) { 
    var someMessage = x.ToString(); 
    doSomething(someMessage); 
} 
+0

Estoy totalmente de acuerdo. Esto plantea la pregunta de por qué está permitido en primer lugar ... debe haber algunas ventajas en esta característica. – InBetween

+0

@InBetween, por el contrario, ¿por qué no estaría permitido? El lenguaje permite la instrucción 'foreach (var x in foos)', donde' statement' es una declaración legal en el código. ¿Cuál es la declaración aquí? A '{codeblock; } ' Acabamos de establecer que '{codeblock; } 'es una declaración legal. Entonces, la pregunta podría no ser por qué permitirlo, pero cuál es la razón imperiosa para rechazarlo. Pero no he topado con mi comentario aquí en contra de la especificación del lenguaje u otros recursos, así que quizás consideren esto solo como un montón de palabras. –

0

La respuesta rápida es que evita cambiar involuntariamente una variable de forma inesperada. Al tenerlo "en alcance" puede actuar sobre él solo cuando lo desee y no "accidentalmente" cambiar el valor

3

Yo diría que la creación de un bloque artificial a los fines del alcance a menudo es simplemente confuso, como usted nota. Nunca he encontrado la necesidad de eso.

Si hubo alguna necesidad percibida para ello, mi opinión es que la refactorización en un método diferente suele ser una mejor opción.

(tenga en cuenta que no estoy diciendo que es absolutamente mala Sólo creo que había necesidad alguna necesidad muy especializado para tenerlo.)