82 votes

Est-ce une bonne approche d'appeler return inside en utilisant l'instruction {}?

Je veux juste savoir si c’est une bonne approche d’appeler return dans un bloc using .

Par ex.

 using(var scope = new TransactionScope())
{
  // my core logic
  return true; // if condition met else
  return false;
  scope.Complete();
}
 

Nous savons que la dernière accolade la plus bouclée, dispose() sera appelée. Mais que sera le cas ci-dessus, puisque return saute le contrôle hors de la portée donnée (autant que je sache) ...

  1. Est-ce que mes scope.Complete() sont appelés?
  2. Et ainsi pour la méthode dispose() de la portée.

128voto

Øyvind Bråthen Points 25211

Il est parfaitement sûr pour appeler return à l'intérieur de votre using bloc, depuis un à l'aide de bloc est juste un try/finally bloc.

Dans l'exemple ci-dessus après le retour true, la portée de l'obtenir éliminés et la valeur retournée. return false, et scope.Complete() sera pas appelée. Dispose toutefois être appelée, que depuis qu'elle réside à l'intérieur du bloc finally.

Votre code est essentiellement la même que celle de (si cela est plus facile à comprendre):

var scope = new TransactionScope())
try
{
  // my core logic
  return true; // if condition met else
  return false;
  scope.Complete();
}
finally
{
  if( scope != null) 
    ((IDisposable)scope).Dispose();
}

S'il vous plaît être conscient que votre transaction sera jamais s'engager en tant qu'il n'y a pas de moyen scope.Complete() pour valider la transaction.

6voto

Lucero Points 38928

C'est très bien - finally clauses (ce que fait l'accolade fermante de la clause using sous le capot) sont toujours exécutées lorsque la portée est laissée, peu importe comment.

Toutefois, cela n’est vrai que pour les instructions qui se trouvent dans le bloc finally (qui ne peuvent pas être définies explicitement lorsqu’on utilise using ). Par conséquent, dans votre exemple, scope.Complete() ne serait jamais appelé (je pense cependant que le compilateur vous avertira du code inaccessible).

2voto

Mennan Kara Points 4008

En général, c'est une bonne approche. Mais dans votre cas, si vous revenez avant d'appeler le scope.Complete() , il ne fera que supprimer le TransactionScope. Cela dépend de votre conception.

Ainsi, dans cet exemple, Complete () n'est pas appelée et la portée est supprimée, en supposant qu'elle hérite de l'interface IDisposable.

2voto

Tony Kh Points 756

scope.Complete doit absolument être appelé avant return . Le compilateur affichera un avertissement et ce code ne sera jamais appelé.

En ce qui concerne return lui-même - oui, il est prudent de l'appeler dans la déclaration using . Utiliser est traduit pour essayer-finalement bloquer derrière la scène et enfin bloquer doit certainement être exécuté.

1voto

Aristos Points 40367

Pour être sûr que le scope.Complete() sera appelé, faîtes le avec try/finally . Le dispose est appelé parce que vous l'avez déformé avec le bloc using qui constitue un bloc alternatif try/finally .

 using(var scope = new TransactionScope())
{
  try
  {
  // my core logic
  return true; // if condition met else
  return false;
  }
  finally
  {
   scope.Complete();
  }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X