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?
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?
Comme plusieurs autres l'ont souligné en général, ce n'est pas un problème.
Le seul cas où cela vous posera des problèmes est si vous revenez au milieu d'une instruction using et que vous retournez également la variable in using. Mais là encore, cela vous causerait également des problèmes même si vous ne retourniez pas et gardiez simplement une référence à une variable.
using ( var x = new Something() ) {
// not a good idea
return x;
}
Tout aussi mauvais
Something y;
using ( var x = new Something() ) {
y = x;
}
return
instruction rend la fin duusing
bloc inaccessible par tous les chemins de code. La fin duusing
bloc doit être exécutée afin que l'objet puisse être supprimé si nécessaire.C'est parfaitement bien.
Vous pensez apparemment que
se traduit aveuglément en:
Ce qui, certes, serait un problème, et rendrait la
using
déclaration plutôt inutile - c'est pourquoi ce n'est pas ce qu'il fait.Le compilateur s'assure que l'objet est supprimé avant que le contrôle ne quitte le bloc, quelle que soit la façon dont il quitte le bloc.
la source
C'est très bien - pas de problème du tout. Pourquoi croyez-vous que c'est mal?
Une instruction using n'est que du sucre syntaxique pour un bloc try / finally, et comme le dit Grzenio, il est également possible de revenir d'un bloc try.
L'expression de retour sera évaluée, puis le bloc finally sera exécuté, puis la méthode reviendra.
la source
Cela fonctionnera parfaitement bien, tout comme le retour au milieu de
try{}finally{}
la source
C'est tout à fait acceptable. Une utilisation instruction garantit que l'objet IDisposable sera supprimé quoi qu'il arrive.
Depuis MSDN :
la source
Le code ci-dessous montre comment
using
fonctionne:Production:
Les éliminés sont appelés après l'instruction return mais avant la sortie de la fonction.
la source
Ce n'est peut-être pas vrai à 100% que c'est acceptable ...
S'il vous arrive d'imbriquer des utilisations et de revenir de l'intérieur d'une imbriquée, cela peut ne pas être sûr.
Prenez ceci comme exemple:
Je passais dans un DataTable pour être sorti en csv. Avec le retour au milieu, il écrivait toutes les lignes dans le flux, mais le csv en sortie manquait toujours une ligne (ou plusieurs, selon la taille du tampon). Cela m'a dit que quelque chose n'était pas fermé correctement.
La bonne façon est de vous assurer que toutes les utilisations précédentes sont éliminées correctement:
la source