Vous pouvez certainement faire ce que vous demandez. Il semble y avoir deux camps sur la question de savoir si vous devriez ou non. Il y en a qui disent qu'il ne devrait y avoir qu'un seul point de sortie d'une fonction. Ils suggèrent que vous devriez utiliser une variable d'indicateur pour enregistrer que vous devez quitter (et éventuellement toutes les données que vous devez retourner), puis retourner une fois que vous avez rompu votre boucle ou atteint la fin de vos arbres if/else .
Personnellement, je n'ai aucun problème avec plusieurs points de sortie d'une fonction, tant qu'ils sont symétriques. Qu'est-ce que je veux dire par "symétrique"? Eh bien, si je vais revenir de l'intérieur d'une boucle, alors je veux aussi revenir à la fin de la boucle (au cas où je n'atteindrais jamais la condition dans la boucle qui me ferait revenir plus tôt). Si je suis à l'intérieur d'un complexe, si/sinon la hiérarchie et moi revenons de l'un des cas, alors je devrais revenir de l'intérieur de chacun d'eux.
Voici quelques exemples rapides de la façon dont je préfère écrire mon code:
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;
}
}
}
Ce n'est pas vraiment une règle dure et rapide que je l'ai beaucoup réfléchi, mais il est tout simplement la façon que je préfère l'écrire parce que cela me semble le plus propre. Dans certains cas, il est plus logique d'utiliser une variable d'indicateur et de revenir simplement à un endroit.
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;
}
L'index 1 est dû à l'indentation ... :-) –
J'ai copié ce code à partir de MSDN tel qu'il était. – dotnetdev
Je sais, c'était juste une blague. Commencer un index à 1 n'est pas faux, mais cela fait contracter involontairement certains développeurs. –