2010-08-04 5 views
9

Est-ce que cela a du sens?Utilisation de l'instruction "using" pour disposer

Avoir une classe simple

class Test 
    { 
    public Test() 
    { 
     // Do whatever 
    } 
    } 

et instanciation il

using(new Test()) 
{ 
    // Nothing in here 
} 

L'instruction à l'aide est là juste pour vous assurer de test est disposé. quand il sera disposé si je viens appeler

new Test() 
+10

Est-ce sous l'hypothèse que '' test' met en œuvre IDisposable'? –

+0

Non, ce n'est pas le cas. Comment savoir si un cours doit l'implémenter ou non? Est-ce que tu le fais toujours? – Jla

+3

Je * soupçonne * que vous êtes en train de confondre «collection de garages» et «élimination», qui sont deux concepts liés mais très différents. –

Répondre

11

Test n'est pas IDisposable, ce qui va même pas compiler. Mais si était jetable, oui using le fera, et new par lui-même ne sera pas. C'est un usage inhabituel, mais j'ai vu similaire. Rarement. En fonction de votre commentaire (question principale), j'ai suspecte que vous confondiez la collecte et l'élimination des ordures. Il n'y a aucun moyen de forcer quelque chose à être collecté, à court de GC (que vous devriez faire pas). À moins que vous ayez un vraiment bonne raison de le vouloir collecté, laissez-le être - il y a de fortes chances que ce soit "génération 0" et qu'il soit collecté à moindre coût de toute façon.

En outre, le «faire n'importe quoi» suggère faire quelque chose dans un constructeur, mais ne se soucie pas de l'objet créé; une méthode statique serait préférable:

public class Test { /* could be static */ 
    public static void DoSomething() { ... } 
} 
... 
Test.DoSomething(); 
+0

Je discuterais sur «l'usage inhabituel», en fait, je l'utilise assez souvent. – nothrow

+0

@Yossarian - pouvez-vous expliquer pourquoi et comment est-ce mieux qu'une méthode normale? – Kobi

+0

bien: une action (initiale) est liée à une autre action (finale), par exemple: 'HtmlWriter.RenderBeginTag()', 'RenderEndTag()'. Si vous lancez une exception entre ces deux-là (ou si vous oubliez RenderEndTag), il en résulte un format html/xml mal formé. Donc, j'ai écrit la méthode d'extension sur RenderBeginTag, qui retourne la classe IDisposable en appelant simplement RenderEndTag, et je vois maintenant clairement, (via l'indentation) où est la balise ouverte/fermée. Un autre exemple consiste à mesurer combien de temps un bloc a pris pour fonctionner. Mais, YMMV. – nothrow

2

En n'assignons l'instance à une variable, il sera admissible à GC dès qu'il est hors de portée.

Ou, y a-t-il autre chose que vous essayez d'accomplir avec ceci?

+0

Rien d'autre. Comme Marc l'a souligné, je dirigeais mes actions dans le constructeur de la classe, ce qui semble être une mauvaise pratique (ou du moins inhabituelle). Je n'ai pas besoin de la classe plus loin que ça. – Jla

Questions connexes