2009-09-14 6 views
5

Existe-t-il un moyen d'exécuter "automatiquement" le code de finalisation/destructeur dès qu'une variable perd la portée dans un langage .Net? Il me semble que puisque le garbage collector s'exécute à une heure indéterminée, le code destructeur n'est pas exécuté dès que la variable perd la portée. Je me suis rendu compte que je pouvais hériter de IDisposable et appeler explicitement Dispose sur mon objet, mais j'espérais qu'il pourrait y avoir une solution plus maniable, similaire à la façon dont non.Net C++ gère la destruction d'objets.Le code peut-il être exécuté lorsqu'un objet tombe hors de la portée dans .Net?

Comportement souhaité (C#):

public class A { 
    ~A { [some code I would like to run] } 
} 

public void SomeFreeFunction() { 
    SomeFreeSubFunction(); 
    // At this point, I would like my destructor code to have already run. 
} 

public void SomeFreeSubFunction() { 
    A myA = new A(); 
} 

Moins souhaitable:

public class A : IDisposable { 
    [ destructor code, Dispose method, etc. etc.] 
} 

public void SomeFreeFunction() { 
    SomeFreeSubFunction(); 
} 

public void SomeFreeSubFunction() { 
    A myA = new A(); 
    try { 
     ... 
    } 
    finally { 
     myA.Dispose(); 
    } 
} 

Répondre

9

L'utilisation de construction se rapproche le plus de ce que vous voulez:

using (MyClass o = new MyClass()) 
{ 
... 
} 

Dispose() est appelé automatiquement, même si une exception s'est produite. Mais votre classe doit implémenter IDisposable.

Mais cela ne signifie pas que l'objet est retiré de la mémoire. Vous n'avez aucun contrôle sur cela.

+0

(+1) Il est bon de noter que "using" est un raccourci pour utiliser la méthode Dispose et spécifiquement pas pour utiliser le destructeur et retirer l'objet de la mémoire. –

4

Le mot-clé à l'aide d'un objet qui implémente IDisposable exactement ce que fait.

Par exemple:

using(FileStream stream = new FileStream("string", FileMode.Open)) 
{ 
    // Some code 
} 

C'est remplacé par le compilateur à:

FileStream stream = new FileStream("string", FileMode.Open); 
try 
{ 
    // Some code 
} 
finally 
{ 
    stream.Dispose(); 
} 
3

Malheureusement, non. La meilleure option consiste à implémenter IDisposable avec le IDisposable pattern.

+0

Voir aussi http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae – TrueWill

Questions connexes