2009-02-18 8 views
5

PGNAP: Uses of "using" in C#Quel est le but de l'utilisation?

J'ai vu des gens utiliser ce qui suit et je me demande quel est son but? Est-ce ainsi que l'objet est détruit après son utilisation par le garbage collection?

Exemple:

using (Something mySomething = new Something()) { 
    mySomething.someProp = "Hey"; 
} 
+0

Duplication de http://stackoverflow.com/questions/75401/uses-of-using-in-c – tvanfosson

+0

On le trouve également avec une simple recherche google et dans la documentation MSDN. –

+0

@Charles: Et les réponses GIYF ne sont pas du tout les bienvenus ici. – GEOCHET

Répondre

2

L'instruction à l'aide a pour effet bénéfique de disposer tout ce qui est dans le() lorsque vous remplissez le bloc à l'aide.

4

L'instruction using garantit que Dispose() est appelé même si une exception se produit lorsque vous appelez des méthodes sur l'objet.

2

Vous pouvez utiliser using lorsque la classe Something implémente IDisposable. Cela garantit que l'objet est correctement éliminé même si vous rencontrez une exception dans le bloc using.

Par exemple, vous ne devez pas gérer manuellement les exceptions potentielles simplement pour appeler Dispose, le bloc using le fera automatiquement pour vous.

Il est équivalent à ceci:

Something mySomething = new Something(); 
try 
{ 
    // this is what's inside your using block 
} 
finally 
{ 
    if (mySomething != null) 
    { 
     mySomething.Dispose(); 
    } 
} 
6

En utilisant, à peu près translatés, à:

Something mySomething = new Something(); 
try 
{ 
    something.someProp = "Hey"; 
} 
finally 
{ 
    if(mySomething != null) 
    { 
    mySomething.Dispose(); 
    } 
} 

Et c'est à peu près tout. Le but est de soutenir la disposition déterministe, ce que C# n'a pas parce que c'est un langage récupéré. Les modèles using/Disposal donnent aux programmeurs un moyen de spécifier exactement quand un type nettoie ses ressources.

+0

@Randolpho, Pas tout à fait. L'objet est instancié en dehors du bloc try ... finally. Si l'objet ne parvient pas à instancier, il ne peut pas/ne doit pas être éliminé. – LukeH

+0

@Randolpho, Et l'IL générée vérifie également que l'objet n'est pas nul avant d'essayer d'appeler Dispose. – LukeH

+0

Bons points, Luke. J'ai fait une préface avec "à peu près", souvenez-vous;) – Randolpho

1

Utilisation est traduite en

try 
{ 
    ... 
} 
finally 
{ 
    myObj.Dispose(); 
} 

lors de la compilation (donc en IL).

Donc, fondamentalement, vous devriez l'utiliser avec tous les objets qui implémente IDisposable.

0

Le bloc 'using' est un moyen de garantir que la méthode 'disposer' d'un objet est appelée à la sortie du bloc. C'est utile parce que vous pouvez quitter ce bloc normalement, à cause de pauses, parce que vous êtes revenu, ou à cause d'une exception. Vous pouvez faire la même chose avec 'try/finally', mais 'using' rend plus clair ce que vous voulez dire et ne nécessite pas de variable déclarée en dehors du bloc.

Questions connexes