Salir de un método void?


Tengo este método (código modificado):

public static void PublishXmlForCustomTypes(MyOwnClass DefaultOutputInformation)
{
    if (DefaultOutputInformation != null)
    {
        ///lot of code
    }
}

Y todo mi código estaba dentro de la declaración if y después de pensarlo, cambié a esto:

public static void PublishXmlForCustomTypes(MyOwnClass DefaultOutputInformation)
{
    if (DefaultOutputInformation == null)
    {
        return;
    }
    ///lot of code
}

Por lo que he probado, parece ser estrictamente equivalente, pero es que realmente el caso ? Quiero decir, la declaración de "retorno" nos saca del método correcto ?

Author: ColinE, 2012-01-18

9 answers

Esto es estrictamente equivalente y la segunda versión es el camino a seguir:)

 39
Author: Guillaume Slashy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 15:24:21

Sí, eso está absolutamente bien.

Algunas personas se adhieren dogmáticamente a "un punto de salida por método", lo que era apropiado cuando era relativamente difícil asegurarse de que siempre se hacía la cantidad correcta de limpieza al final de una función en C, por ejemplo... pero no es realmente necesario en C#.

Personalmente creo que es apropiado regresar tan pronto como sepa que ha hecho todo el trabajo que realmente desea en un método. Utilice try/finally o using instrucciones para realizar cualquier extra "limpiar sin embargo salgo" trabajo.

 7
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 15:25:50

Yes return te saca del método; si tienes un bloque finally y llamas a return desde el bloque try, el bloque finally se ejecuta de todos modos.

 4
Author: Davide Piras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 15:25:13

Sí, la instrucción return finaliza el método.

 3
Author: Jorge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 15:26:52

Sí, la devolución te sacará del código. Generalmente es una buena práctica como primer paso en una función verificar que los parámetros que se pasaron son lo que crees que son y salir (a través del retorno o lanzar una excepción) para que no hagas ningún procesamiento innecesario solo para tener que abortar más adelante en la función.

 2
Author: FuriousGeorge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 15:31:21

Sí, sus suposiciones son correctas.

Para algunos antecedentes, aprenda sobre dualidad.

 1
Author: leppie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 15:24:48

Sí, es exactamente lo mismo, puede leer la documentación de MSDN sobre la palabra clave return para comprender completamente cómo funciona: http://msdn.microsoft.com/en-us/library/1h3swy84.aspx

Para decidir qué camino es mejor : ambos son buenos, pero la segunda versión lo hace más legible porque entonces todo su código no está dentro de un bloque if. De esta manera, puede ver lo que hace la condición realmente fácilmente en lugar de leer todo el código del método.

 1
Author: StevenGilligan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 15:25:01

De hecho, el return te saca del método, por lo que es equivalente a la primera forma que usaste. Cuál es mejor depende de tu código, aunque generalmente preferiría la segunda versión.

 1
Author: Grizzly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 15:25:50

Mirando el código revisado, el segundo es el camino a seguir. Si bien es funcionalmente equivalente, piense en el caso en el que pasó 4 variables diferentes a una función que desea verificar. En lugar de tener una instrucción do a nasty 4 level if con {'s everywhere, el segundo método le permite limpiar la apariencia del código y no agregar niveles innecesarios de corchetes. Si está escribiendo en C / C++, incluso puede hacer que esta sea una macro como VERYIFY_NOT_NULL (x) y hacer que el código bonito y ordenado.

El código legible/mantenible supera los nanosegundos de rendimiento el 99% del tiempo.

 1
Author: FuriousGeorge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 15:37:27