Quel est le but du bloc Using en C #? En quoi est-ce différent d'une variable locale?
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.
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.
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.
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 # .
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 .
using (B a = new B())
{
DoSomethingWith(a);
}
est équivalent à
B a = new B();
try
{
DoSomethingWith(a);
}
finally
{
((IDisposable)a).Dispose();
}
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.
L'instruction using obtient une ou plusieurs ressources, exécute une instruction, puis dispose de la ressource.
C’est vraiment un sucre syntaxique qui ne vous oblige pas à appeler explicitement Dispose sur les membres qui implémentent IDisposable.