Devuelve un valor.
¿Por qué?
corrección, legibilidad y Auto-Documentación
intencional y fácil de entender el código es mejor que el código de efectos secundarios. Consideremos:
float area = pi * Square(r);
vs
Square(r);
float area = pi * r;
// ... intervening code
float x = r * 5; // did you mean to use the original r or r-squared here?
Ten en cuenta también las ventajas de la concisión a través del composability en el primer ejemplo.
Considerar los métodos mismos, comparar:
int DoSomething(int value)
{ return value+1; }
que es bastante obvio correcta. contra
void DoSomething(int value)
{ value++; }
Lo que parece correcto y se compilará muy bien, pero en realidad es solo una no-op. Lo que realmente quiere es la siguiente:
void DoSomething(ref int value)
{ value++; }
// client code:
DoSomething(ref a);
Las variables son baratos
Muchas variables bien llamada es preferible sobre algunas variables de propósito general reutilizados. Resista la tentación de optimizar prematuramente, la posibilidad de que necesite reducir el número de variables locales para mejorar el rendimiento de su sistema es cósmicamente pequeña. De nuevo, las variables son baratas, ¡NO REUTILICE LAS VARIABLES!
Comprobabilidad
considerar:
Assert.IsTrue(Square(2) == 4);
vs.
float a = 2;
Square(a);
Assert.IsTrue(a == 4);
Existen muchas otras ventajas para evitar la mutación antes que devolver un valor. No es simplemente un accidente que las matemáticas definan una función como un mapeo de valores de entrada a valores de salida.
Para su información, las dos funciones enumeradas son incorrectas. "valor de retorno ++;" devolverá solo el valor, desea "valor de retorno + 1;" o "return ++ value;", y el valor de entrada es solo una copia de la variable pasada a la función a menos que lo designe como un parámetro de referencia con la palabra clave "ref". – Wedge
Este fue un ejemplo excesivamente simplista de mi problema, pero gracias por señalarlo de todos modos. Los métodos en cuestión en mi código están manipulando diccionarios y cadenas. – JMS