2011-05-26 15 views
6

ReSharper generalmente me sugiere eso, y todavía estoy buscando una buena razón de por qué hacerlo.¿Debo declarar las variables lo más cerca posible del alcance donde se utilizarán?

La única cosa que me vino a la mente es que la declaración de acercarlo al alcance se va a utilizar, puede evitar la inicialización en algunos casos en que no sea necesario (debido a una condición, etc.)

algo relacionado con esto es la siguiente:

int temp; 
foreach (var x in collection) { 
    temp = x.GetValue(); 
    //Do something with temp 
} 

¿es realmente diferente que

foreach (var x in collection) { 
    int temp = x.GetValue(); 
    //... 
} 

quiero decir, no es el segundo código más caro, ya que es la asignación memoria cada vez? ¿O ambos son lo mismo? Por supuesto, después de terminar el ciclo, en el segundo código el recolector de basura se ocupará de la variable temp, pero no en el primero ...

Respuesta

5

El costo del segundo ejemplo es insignificante. La única diferencia es que en el primer ejemplo, temp estará disponible fuera del alcance del bucle for, y por lo tanto existirá más tiempo que si lo declarara dentro del bucle for.

Si no necesita temp fuera del bucle for, no debe declararse fuera de ese bucle. Como otros han dicho, la legibilidad y el estilo están más en juego aquí que el rendimiento y la memoria.

+0

Entonces, ¿no hay ninguna diferencia de rendimiento entre esos dos códigos? (es un 'int', pero podría ser una clase más compleja que requerirá más espacio en la memoria ...) –

+0

@Oscar - Las variables de pila son esencialmente gratuitas, aparte de un costo de inicialización mínimo. –

+0

El compilador puede mover variables declaradas dentro del bucle fuera del bucle de todos modos, así que no, realmente no hay ninguna diferencia de rendimiento. Obtiene legibilidad y mantenibilidad al declararlos al principio del alcance en el que los necesita. –

6

Declarar lo más cerca posible de usar es una decisión de legibilidad. Su ejemplo no lo muestra, pero en los métodos más largos es difícil examinar el código para encontrar la variable de temperatura.

También es una ventaja de refactorización. Declarar más cerca de la fuente lleva a una refactorización más fácil más tarde.

1

No hay beneficios de rendimiento, creo, pero más de un estilo de codificación. Su estilo de programación es más C para declararlo todo al comienzo del alcance. Hay más detalles aquí: Scope of variables in C#

4

Acepto que si inicia una variable dentro del alcance que está siendo utilizado, entonces está ayudando al gc, pero creo que el verdadero motivo tiene más que ver con las mejores prácticas de mantenimiento de código . Es una especie de forma de reducir la carga cognitiva sobre usted u otro desarrollador que vuelve al código después de meses (o años) de no mirar un bloque en particular. Claro, IDE te ayuda a descubrir cosas, pero aún tienes que hacer el baile de "ir a la definición".

+0

De acuerdo. Espero que esa sea una de las mejores razones ':)' –

+0

Quería aclarar por qué puede reducir la carga cognitiva en caso de que alguien tenga curiosidad. Otros desarrolladores no tendrán que pensar tanto en dónde más 'temp' se está utilizando. Ayuda a dar contexto a esa variable. – bowserm

0

me enseñaron siempre que declarar las variables en la parte superior de una función, clase, etc. Esto hace que sea más fácil de leer.

+3

¿Qué idioma usabas entonces? –

1

Es un estilo de preferencia personal que tiene que ver con la legibilidad.

Hay muy pocos idiomas/sistemas en los que esto tiene un efecto notable en el rendimiento.

Intento seguir estas dos reglas.

Todos los atributos principales de una clase se deben definir juntos en un solo lugar. p.ej. Si está manejando un pedido, entonces orderno, customerno, amount, taxes, etc. deben definirse juntos.

Todos los atributos técnicos que forman parte de la mecánica interna de la clase, tales como iteradores, banderas, variables de estado deben definirse cerca de su uso.

O para ponerlo otro tipo de datos comerciales/externos, todos definidos en un solo lugar, datos técnicos/internos definidos cerca del uso.

1

La diferencia es una cuestión de estilo de codificación y una de esas disputas que los diferentes estándares de codificación tienen reglas completamente opuestas. El conflicto sigue siendo más fuerte en el mundo C++ donde el lenguaje C obligó a declarar las variables al comienzo de un ámbito y por lo tanto los veteranos (como yo) estaban bien acostumbrados a "mirar el principio de la función" para encontrar variables.

El estilo de C# que más a menudo se ve es que las variables aparecen en el momento en que se necesitan. Este estilo limita la existencia de la variable y minimiza la posibilidad de que pueda significar alguna otra variable accidentalmente. Me resulta muy fácil de leer.

En la era moderna de C#, poner la declaración de variables en su primer punto de uso es más claramente beneficioso cuando se combina con la característica var tanto amada como odiada. Usar varsimplemente no es tan útil a menos que lo use con una tarea que le permita al compilador y a los lectores inferir el tipo de la variable. La característica varalienta la declaración con el primer uso.

Yo, me encanta var, y así puedes adivinar qué estilo de codificación prefiero.

Cuestiones relacionadas