2012-04-07 25 views
10

Supongamos que tengo un poco de código como este:C# evitando declaración de variables

public string SomeMethod(int Parameter) 
{ 
    string TheString = ""; 

    TheString = SomeOtherMethod(Parameter); 

    return TheString; 
} 

Por supuesto, este código es equivalente a esto:

public string SomeMethod(int Parameter) 
{ 
    return SomeOtherMethod(Parameter); 
} 

creo que la primera versión es más fácil de leer y así es como Estoy escribiendo mi código, incluso pensé que estaba usando una variable cuando sé que podría evitarlo. Mi pregunta es esta: ¿el compilador compila el código de la misma manera (es decir, el mismo rendimiento) o es la segunda opción realmente mejor en términos de rendimiento.

Gracias.

+0

Deseo tener "cadena TheString =" ";" considere utilizar string.Empty –

+1

¿Cómo es posible que la primera forma sea más legible? Lleva más tiempo leer y hay más por procesar. –

+0

@ alpha123: Tengo todas mis variables declaradas en la parte superior del método – frenchie

Respuesta

19

Yo diría que la primera forma es menos legible y que contiene un inicializador redundante. ¿Por qué inicializar la variable en "" si está a punto de darle un valor diferente? Al menos cambiarlo a:

public string SomeMethod(int parameter) 
{ 
    string returnValue = SomeOtherMethod(parameter);  
    return returnValue; 
} 

o si realmente desea separar declaración de inicialización:

public string SomeMethod(int parameter) 
{ 
    string returnValue; 
    returnValue = SomeOtherMethod(parameter);  
    return returnValue; 
} 

(Tenga en cuenta que yo también he ajustado el llamado a seguir las convenciones de nomenclatura y .NET para dar un nombre más significativo a la variable local - "TheString" no transmite ningún significado útil.)

Realmente no verá ningún problema de rendimiento al usar la variable local, pero realmente lo alentaría a pensar en th e legibilidad ¿Cuál es el propósito de la variable local aquí? Presumiblemente describiría el método como: "Devuelve el resultado de llamar al SomeOtherMethod con el parámetro dado" - en ese punto, la versión de una línea implementa exactamente esa descripción.

+0

El código que proporcioné es realmente una simplificación: la variable returnValue pasa por varias sentencias if y, a veces, otras llamadas a funciones. Usaré la cadena TheString; en lugar de cadena TheString = ""; para inicializar Adquirí el hábito de usar The delante de mis nombres variables para poder encontrarlos fácilmente con intellisense y ninguno se llama TheString, sino TheCounter o ThePermission ... Gracias por la respuesta. – frenchie

+0

Totalmente de acuerdo, deseo agregar. Requiero que, al menos, todos los métodos, propiedades o clases públicos, se describan en su funcionalidad, parámetros y valor de retorno esperado mediante el comentario XML. – Steve

+10

@frenchie: es difícil dar consejos sobre el código que es completamente diferente al ejemplo que ha dado. También te sugiero que si encuentras que tus variables locales son difíciles de seguir, tus métodos probablemente sean más largos de lo que deberían ser. No debería necesitar recurrir a prefijos para comprender su código. –

13

El compilador producirá un código muy similar para sus dos ejemplos. Sin embargo, una pequeña modificación es evitar inicializar a una cadena vacía que nunca usas.

public string SomeMethod(int Parameter) 
{ 
    string result; 
    result = SomeOtherMethod(Parameter); 
    return result; 
} 

no estoy seguro de volver a escribir el código de esta manera hace que sea más fácil de leer, pero sí quiere decir que se puede añadir un punto de interrupción y ver el valor de result antes el método retorna. Esto puede ser útil cuando se depura.

Nota usted puede combinar la primera y segunda línea y aún así obtener este beneficio:

public string SomeMethod(int Parameter) 
{ 
    string result = SomeOtherMethod(Parameter); 
    return result; 
} 

creo que este última versión es a la vez muy fácil de leer y fácil de depurar.

+0

bien, gracias por el consejo de inicialización: eliminaré el = ""; de mi código – frenchie

+0

En algunos casos, tengo una inicialización con = ""; y luego tengo la asignación en una declaración if. Si la instrucción if nunca se ejecuta, entonces la variable de retorno es igual a "". Entonces, en algunos casos, realmente necesito tener la cadena TheString = ""; ¿Hay alguna otra forma de hacerlo? – frenchie

+2

@frenchie: podría usar 'theString = null' en el bloque else. En la mayoría de los casos puede refactorizar el código para evitar tener que inicializar temporalmente las variables a nulo antes de establecer el valor real, pero tendría que publicar su código específico antes de poder comentarlo. –

4

respuesta ya está publicada, aunque te voy a dar una oportunidad diferente:

Hay 3 cosas que usted está buscando:

legibilidad, rendimiento, utilidad (como la depuración, el registro etc ..)

1. La legibilidad es relativamente relativa. Lo que Eric Lippert/Jon Skeet encuentra algo más legible, lo mismo no me será aplicable.Cada vez más código, muchas cosas y su perspectiva cambiará para mirar el código.

Ambas opciones que dio son legibles, para mí el segundo es más legible.

2. Rendimiento : En la primera opción, como puede ser que me conscientes de la inmutabilidad cadena que si reinicializar una cadena no va a limpiar el nombre anterior (internar) y se creará nueva cadena y la variable se señalarlo.

Por lo tanto, desde la perspectiva del rendimiento inicializar una variable a un nuevo valor (innecesariamente) causará cuello de botella de rendimiento. De nuevo, esto es relativo, y depende del tamaño/complejidad de la aplicación. Para esto necesitas ir con la segunda opción. Su segunda opción y la respuesta de Jon darán como resultado el mismo rendimiento.

3. Perspectiva de depuración: es posible que desee tener una variable local si está buscando estas cosas.

Cuestiones relacionadas