web-dev-qa-db-fra.com

Qu'est-ce que le bloc C # Using et pourquoi devrais-je l'utiliser?

Quel est le but du bloc Using en C #? En quoi est-ce différent d'une variable locale?

247
Ryan Michela

Si le type implémente IDisposable, il le supprime automatiquement.

Donné:

public class SomeDisposableType : IDisposable
{
   ...implmentation details...
}

Ce sont équivalents:

SomeDisposableType t = new SomeDisposableType();
try {
    OperateOnType(t);
}
finally {
    if (t != null) {
        ((IDisposable)t).Dispose();
    }
}
using (SomeDisposableType u = new SomeDisposableType()) {
    OperateOnType(u);
}

La seconde est plus facile à lire et à entretenir.

302
plinth

Using appelle Dispose() après le bloc using-, même si le code lève une exception.

Donc, vous utilisez habituellement using pour les classes qui nécessitent un nettoyage ultérieur, comme IO.

Donc, ce bloc using:

using (MyClass mine = new MyClass())
{
  mine.Action();
}

ferait la même chose que:

MyClass mine = new MyClass();
try
{
  mine.Action();
}
finally
{
  if (mine != null)
    mine.Dispose();
}

Utiliser using est beaucoup plus court et plus facile à lire.

101
Sam

De MSDN:

C #, via le CLR (Common Language Runtime) .NET Framework, libère automatiquement la mémoire utilisée pour stocker les objets devenus inutiles. La libération de la mémoire est non déterministe; la mémoire est libérée à chaque fois que le CLR décide d'effectuer une récupération de place. Cependant, il est généralement préférable de libérer le plus rapidement possible les ressources limitées telles que les descripteurs de fichiers et les connexions réseau.

L'instruction using permet au programmeur de spécifier quand les objets utilisant des ressources doivent les libérer. L'objet fourni à l'instruction using doit implémenter l'interface IDisposable. Cette interface fournit la méthode Dispose, qui devrait libérer les ressources de l'objet.

En d'autres termes, l'instruction using indique à .NET de libérer l'objet spécifié dans le bloc using dès qu'il n'est plus nécessaire.

39
Robert S.

L'instruction using est utilisée pour travailler avec un objet en C # qui implémente l'interface IDisposable.

L'interface IDisposable dispose d'une méthode publique appelée Dispose utilisée pour supprimer l'objet. Lorsque nous utilisons l'instruction using, il n'est pas nécessaire de disposer explicitement de l'objet dans le code, l'instruction using s'en charge.

using (SqlConnection conn = new SqlConnection())
{

}

Lorsque nous utilisons le bloc ci-dessus, le code est généré en interne de la manière suivante:

SqlConnection conn = new SqlConnection() 
try
{

}
finally
{
    // calls the dispose method of the conn object
}

Pour plus de détails, lisez: Comprendre l'instruction 'using' en C # .

24
Sunquick

Notez également que l'objet instancié via using est en lecture seule dans le bloc using. Reportez-vous à la référence officielle C # ici .

6
user3083619
using (B a = new B())
{
   DoSomethingWith(a);
}

est équivalent à

B a = new B();
try
{
  DoSomethingWith(a);
}
finally
{
   ((IDisposable)a).Dispose();
}
5
Bert Huijben

Le fait de placer du code dans un bloc using garantit que les objets sont supprimés (même s'ils ne sont pas nécessairement collectés) dès que le contrôle quitte le bloc.

5
TheSmurf

L'instruction using obtient une ou plusieurs ressources, exécute une instruction, puis dispose de la ressource.

2
Meera Tolia

C’est vraiment un sucre syntaxique qui ne vous oblige pas à appeler explicitement Dispose sur les membres qui implémentent IDisposable.

2
SaaS Developer