2012-08-16 17 views
8

Duplicar posible:
Is it better to declare a variable inside or outside a loop?¿Es esta "declaración de movimiento más cercana al uso" realmente preferible?

ReSharper quiere que cambie esto:

int Platypus; 
string duckBill1; 
string duckBill2; 
string duckBill3; 
. . . 
using (OracleDataReader odr = ocmd.ExecuteReader()) { 
    while (odr.Read()) { 
     Platypus = odr.GetInt32("Platypus"); 
     duckBill1 = odr.GetString("duckBill1"); 
     duckBill2 = odr.GetString("duckBill2"); 
     duckBill3 = odr.GetString("duckBill3"); 
     switch (Platypus) { 
     . . . 

... a esto:

using (OracleDataReader odr = ocmd.ExecuteReader()) { 
    while (odr.Read()) { 
     int Platypus = odr.GetInt32("Platypus"); 
     string duckBill1 = odr.GetString("duckBill1"); 
     string duckBill2 = odr.GetString("duckBill2"); 
     string duckBill3 = odr.GetString("duckBill3"); 
     switch (Platypus) { 
     . . . 

... pero de esta manera (parece, al menos, eso) los vars se declaran N veces, una vez por cada vez a través del ciclo while. ¿La forma Resharperizada es realmente mejor que la original?

Respuesta

16

Sí, es mejor porque limita el alcance de las variables declaradas. No habrá impacto en el rendimiento al declararlos dentro del ciclo. La razón por la cual Resharper sugiere este cambio es porque no los estás usando fuera del ciclo.

+5

Y si los declara fuera del ciclo, su alcance será más amplio, lo que significa que tardará más en liberarse. +1 –

+1

@AndreCalil No, no lo hará, porque el alcance no tiene nada que ver con la elegibilidad para la recolección. El impacto en el rendimiento es nulo, como dice rsbarro. –

+0

@JonHanna Lo siento, no veo dónde están las colecciones en el tema. Si declara una variable en el alcance de un método, no se liberará hasta el final del método. Si el alcance es solo un bucle (como ese 'while'), se lanzará antes. E incluso una cadena nula asigna memoria: http://stackoverflow.com/a/6601485/1484750 –

2

El compilador generalmente optimizará tales expresiones y "levantará" la declaración de la variable fuera del bucle, ya que la variable en sí misma no depende de las condiciones del bucle. Esto produce efectivamente el código que demostró en el primer ejemplo.

En este caso, la sugerencia de Resharper es simplemente eliminar algunas líneas redundantes de código, además de reducir su ámbito precompilado.

+0

No hay nada que levantar, la declaración solo dice "cuando se usa este nombre dentro de este alcance, significa ...", que no se traduce al código compilado. Sin embargo, si se le asignaba la declaración, y esa asignación no se sobrescribía más adelante en el ciclo (lo que cambiaría el significado de todos modos), lo más probable es que se elimine. –

4

Sí, pero declararlos no toma tiempo en el tiempo de ejecución. No ocupan más memoria porque el compilador simplemente reutilizará sus ubicaciones de memoria.

8

En general, es una buena práctica de programación declarar las variables en un ámbito lo más limitado posible. Las razones son:

  1. Información oculta.
  2. Más fácil de entender.
  3. Menos probabilidad de que algo se agote.

Aunque parece que las variables se declaran recientemente con cada iteración en el ciclo, se declaran en tiempo de compilación, no en tiempo de ejecución. El espacio se asigna en el marco de la pila para la variable [s], y ese mismo espacio se reutiliza para cada iteración sobre el ciclo.

Cuestiones relacionadas