328 votes

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

Quel est l'objectif de la Using en C# ? Quelle est la différence avec une variable locale ?

398voto

plinth Points 26817

Si le type implémente IDisposable, il dispose automatiquement de ce type.

Étant donné :

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

Ils 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.


Depuis C# 8, il existe un nouvelle syntaxe pour using qui peut rendre le code plus lisible :

using var x = new SomeDisposableType();

Il n'a pas de { } et la portée de l'utilisation va du point de déclaration à la fin du bloc dans lequel elle est déclarée. Cela signifie que vous pouvez éviter des choses comme :

string x = null;
using(var someReader = ...)
{
  x = someReader.Read();
}

Et prenez ça :

using var someReader = ...;
string x = someReader.Read();

25 votes

Notez qu'en général, le bloc finally vérifie la nullité avant d'appeler Dispose. Non pas que cela soit important lorsque vous appelez un constructeur, mais...

4 votes

Si vous déclarez la variable en dehors du bloc using et créez ensuite une nouvelle instance dans l'instruction using, il se peut que l'élément ne soit pas éliminé.

3 votes

Ainsi, l'instruction using se débarrassera automatiquement de l'objet une fois le contexte terminé, POURQUOI devrions-nous utiliser l'instruction using alors, sur les types qui implémentent IDisposable ? Quels types doivent implémenter cette interface ? Existe-t-il une règle empirique à ce sujet ou dois-je vérifier chaque type individuellement ?

135voto

Sam Points 9445

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

Vous utilisez donc généralement using pour les classes qui nécessitent de nettoyer après eux, comme IO.

Donc, ce bloc d'utilisation :

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

ferait la même chose :

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

Utilisation de using est beaucoup plus court et plus facile à lire.

0 votes

Le contrôle nul est-il nécessaire ? Comment le mien peut-il être nul après "new MyClass()" ; La seule chose que je vois est une OutOfMemoryException mais dans ce cas, il ne devrait même pas entrer dans le bloc try, n'est-ce pas ? EDIT : vous avez probablement écrit ceci pour montrer ce qui est fait habituellement lorsque using est utilisé. A l'intérieur du using, il peut y avoir autre chose qu'un appel à un nouveau constructeur (ex : un appel à une méthode qui retourne null).

2 votes

Eh bien, tu pourrais faire d'autres choses que mine.Action() . Des choses comme mine=null . Sans utiliser le mien, il peut être défini sur n'importe quoi dans le try/catch.

57voto

Robert S. Points 15449

De MSDN :

C#, par le biais du Common Language Runtime (CLR) de .NET Framework d'exécution du langage (CLR), libère automatiquement automatiquement la mémoire utilisée pour stocker les objets qui ne sont plus nécessaires. 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 collecte des déchets. Cependant, il est généralement préférable de libérer des limitées, comme les gestionnaires de fichiers et les connexions réseau, aussi rapidement que possible.

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

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

0 votes

Cela donne la raison d'être de l'utilisation de "using", tandis que @plinth montre ce qu'il fait réellement.

2 votes

En effet. C'est la réponse à la question "A quoi sert le bloc Using en C# ?".

30voto

Sunquick Points 31

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

El IDisposable a une méthode publique appelée Dispose qui est utilisé pour disposer de l'objet. Lorsque nous utilisons l'instruction using, nous n'avons pas besoin 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 interne est généré comme ceci :

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# .

5voto

TheSmurf Points 10872

Le fait de placer du code dans un bloc using garantit que les objets sont éliminés (mais pas nécessairement collectés) dès que le contrôle quitte le bloc.

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