Sin duda puede hacer lo que está pidiendo. Parece que hay 2 campamentos sobre si deberías o no. Hay algunos que dicen que solo debe haber 1 punto de salida de una función. Sugieren que debe usar una variable de marca para registrar que necesita salir (y posiblemente cualquier información que necesite devolver), y luego regresar una vez que haya salido de su ciclo o haya llegado al final de sus árboles if/else .
Personalmente, no tengo ningún problema con los puntos de salida múltiples de una función, siempre que sean simétricos. ¿Qué quiero decir con "simétrico"? Bueno, si voy a regresar desde el interior de un bucle, también quiero regresar al final del bucle (en caso de que nunca llegue a la condición en el bucle que me haría volver temprano). Si estoy dentro de una jerarquía if/else compleja y regreso desde dentro de uno de los casos, entonces debería regresar desde dentro de todos ellos.
Éstos son algunos ejemplos rápidos de lo que prefiero escribir mi código:
public string Search(IEnumerable<string> values)
{
foreach(string value in values)
{
if(SomeArbitraryCondition())
return value;
}
return null;
}
public int PerformAction()
{
if (SomeArbitraryCondition())
{
if (SomeArbitraryCondition())
{
return 1;
}
else
{
return 2;
}
}
else
{
if (SomeArbitraryCondition())
{
return 3;
}
else
{
return 4;
}
}
}
Esto no es realmente una regla dura y rápida que he pensado mucho acerca, pero es simplemente la forma en que yo prefiero escribirlo porque me parece más limpio. En algunos casos, tiene más sentido usar una variable de marcador y simplemente regresar en un solo lugar.
public string Search(IEnumerable<string> values)
{
string found = null;
foreach(string value in values)
{
if(SomeArbitraryCondition())
found = value;
}
return found;
}
public int PerformAction()
{
int state;
if (SomeArbitraryCondition())
{
if (SomeArbitraryCondition())
{
state = 1;
}
else
{
state = 2;
}
}
else
{
if (SomeArbitraryCondition())
{
state = 3;
}
else
{
state = 4;
}
}
return state;
}
El índice 1 se debe a la sangría ... :-) –
He copiado este código de MSDN como estaba. – dotnetdev
Lo sé, fue solo una broma. Comenzar un índice en 1 no está mal, pero hace que algunos desarrolladores tomen involuntariamente. –