187 votes

revenir au milieu d'un bloc d'utilisation

Quelque chose comme:

 using (IDisposable disposable = GetSomeDisposable())
{
    //.....
    //......
    return Stg();
}
 

Je crois que ce n'est pas un endroit approprié pour une déclaration de retour, n'est-ce pas?

189voto

JaredPar Points 333733

Comme plusieurs autres l'ont souligné en général, ce n'est pas un problème.

Le seul cas où cela vous causera des problèmes est si vous revenez au milieu d'une instruction using et renvoyez en plus la variable en utilisant. Mais là encore, cela vous causerait aussi des problèmes même si vous ne reveniez pas et que vous gardiez simplement une référence à une variable.

 using ( var x = new Something() ) { 
  // not a good idea
  return x;
}
 

Aussi mauvais

 Something y;
using ( var x = new Something() ) {
  y = x;
}
 

136voto

James Curran Points 55356

C'est parfaitement bien.

Vous pensez apparemment que

 using (IDisposable disposable = GetSomeDisposable())
{
    //.....
    //......
    return Stg();
}
 

est aveuglément traduit en:

 IDisposable disposable = GetSomeDisposable()
//.....
//......
return Stg();
disposable.Dispose();
 

Ce qui, certes, serait un problème et rendrait la déclaration de using plutôt inutile --- c'est pourquoi ce n'est pas ce qu'elle fait.

Le compilateur s'assure que l'objet est disposé avant que le contrôle ne quitte le bloc - quelle que soit la manière dont il quitte le bloc.

91voto

Jon Skeet Points 692016

C'est très bien - pas de problème du tout. Pourquoi croyez-vous que c'est faux?

Une instruction using est juste du sucre syntaxique pour un bloc try / finally, et comme Grzenio dit que c'est bien de revenir d'un bloc try aussi.

L'expression de retour sera évaluée, puis le bloc finally sera exécuté, puis la méthode reviendra.

25voto

Grzenio Points 16802

Cela fonctionnera parfaitement, tout comme revenir au milieu de try{}finally{}

17voto

mbillard Points 15829

C'est tout à fait acceptable. A l'aide de déclaration assure la IDisposable l'objet sera disposé n'importe quoi.

À partir de MSDN:

L'instruction using assure que Jeter, même si une exception se produit lors de l'appel de méthodes sur l'objet. Vous pouvez obtenir le même résultat en mettant l'objet à l'intérieur d'un bloc try et puis l'appel de la Jeter dans un bloc finally; en fait, c'est la façon dont l'instruction à l'aide qui se traduit par le compilateur.

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