A la fin du bloc (signet1), dans votre exemple, seul l'objet 1 sera éliminé. Dans le cas d'un flux de fichier, cela signifie que le flux sera fermé et que le descripteur sera libéré, mais l'objet chaîne actuel sera toujours en mémoire (prêt à être nettoyé par le GC). Dans votre cas, Object2 ne sera pas éliminé, de sorte que le handle qu'il utilise restera toujours ouvert. Finalement, le GC le collectera et appellera son finalizer, moment auquel il sera libéré correctement. Si vous souhaitez que les deux objets soient "nettoyés" correctement, vous devrez les éliminer tous les deux, soit en les enveloppant dans des instructions, soit en appelant Dispose manuellement.
Il est l'alternative, la syntaxe potentiellement plus propre ainsi:
using (Object1 obj1 = new Object1(), Object2 obj2 = new Object2())
{
// Do something with obj1 & obj2
}
Si vous faites cela, obj1 ET obj2 seront tous deux disposés à l'extrémité du bloc. Dans votre cas, cela signifie que les deux objets seront fermés et que leurs poignées seront libérées. Le GC les nettoiera ensuite lors d'une future collecte des ordures.
Pour plus de détails, voir MSDN's page on using.
Pendant que nous y sommes - Est-ce Object1 être détruits dès que nous sommes à bookmark1 ou sera juste être non-référencés et en attendant le GC de se présenter? – cwap
Il sera "hors de portée" (ce qui est le même que non référencé) et donc attendre que le GC apparaisse et le nettoie plus tard –
[Voir la question similaire ici.] (Http: // stackoverflow .com/questions/212198/what-is-the-c-using-block-et-pourquoi-devrais-je-l'utiliser/212210 # 212210) – plinth