Question

Supposons que j'ai les éléments suivants:

using(var ctx = DataContextFactory.Create(0))
{ ... Some code ... }

Pourquoi ne pas simplement faire ce qui suit et perdre quelques accolades?:

var ctx = DataContextFactory.Create(0);
ctx.Dispose();

Merci pour le conseil!

Était-ce utile?

La solution

Le premier est meilleur. Il s'assure qu'il est supprimé même si une exception est levée et qu'il gère correctement le cas où Create (0) renvoie null (c'est-à-dire qu'il ne tente pas d'appeler Dispose () sur une instance nulle).

Autres conseils

Une instruction utilisant est toujours préférable car ...

  • vous ne pouvez pas oublier d'appeler Dispose () , même si le code évolue en différents chemins de code
  • Dispose () est appelé même s'il existe une exception. Il vérifie également null avant d'appeler Dispose () , ce qui peut être utile (en supposant que vous n'appeliez pas simplement new ).

Une astuce non évidente (en tout cas pour moi) avec à l'aide de est comment vous pouvez éviter une imbrication excessive lorsque vous avez plusieurs objets jetables:

using (var input = new InputFile(inputName))
using (var output = new OutputFile(outputName))
{
    input.copyTo(output);
}

Le formateur de code VS laissera les deux instructions commençant par la même colonne.

En fait, dans certaines situations, vous n'êtes même pas obligé de répéter l'instruction using ...

using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2))

Toutefois, les restrictions relatives à la déclaration de plusieurs variables sur la même ligne s'appliquent ici. Par conséquent, les types doivent être identiques et vous ne pouvez pas utiliser le type implicite var .

Dans la mesure du possible, utilisez à l'aide de pour les raisons citées par Marc. OTOH, ce n’est pas une solution mortelle, car parfois la durée de vie de l’objet ne peut pas être définie comme une portée lexicale, utilisez-la raisonnablement.

Le seul endroit où vous ne souhaitez pas utiliser de bloc using est l'endroit où l'objet jetable est limité à l'extérieur de la fonction. Dans ce cas, votre classe devrait implémenter IDisposable et disposer de l'objet dans sa fonction Dispose ().

L'instruction using vous donne une syntaxe intéressante ainsi qu'une protection par exception. Vous ne pouvez pas quitter l'instruction using sans appeler Dispose (cela se traduit par un blocage final avec un appel à disposer). Dans votre deuxième scénario, si vous aviez une exception entre Créer et Éliminer, vous n'appeleriez pas directement Éliminer. Ce qui ne pose pas de problème, sauf si vous utilisez des ressources non gérées, mais si vous l’êtes, vous fuirez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top