2008-10-06 11 views
4

Je travaille sur une application web et j'ai rencontré la situation suivante.Loops and Garbage Collection

Dim a as Object 
Dim i as Integer = 0 

Try 

    For i=1 to 5 

     a = new Object() 

     'Do stuff ' 

     a = Nothing 

    Next 

Catch 

Finally 

    a = Nothing 

End Try 

Est-ce que je dois faire a = rien dans la boucle ou ce que le garbage collector nettoyer une place?

Répondre

12

Dans .NET, vous généralement pas besoin pour définir une référence variable = Nothing (null en C#). Le ramasse-miettes va nettoyer, finalement. La référence elle-même sera détruite quand elle sort de la portée (soit lorsque votre méthode se termine ou lorsque l'objet de cette classe est finalisé.) Notez que cela ne signifie pas que l'objet est détruit, juste la référence. L'objet sera toujours détruit de façon non déterministe par le collecteur. Toutefois, la définition de votre référence = Nothing indique à .NET que l'objet peut être corrompu et qu'il ne nuit pas nécessairement à quoi que ce soit - à l'exception du fouillis de code. Si vous deviez le conserver, je vous recommande de le retirer du bloc Try; il est déjà dans le bloc Finally et sera donc toujours appelé. (Mis à part certaines exceptions catastrophiques, mais dans ces cas, il ne serait pas appelé dans le bloc Try soit!)

Enfin, je dois admettre que je suis d'accord avec Greg: Votre code serait plus propre sans cela. L'allusion à l'exécution que vous avez terminé avec la référence est agréable, mais certainement pas critique. Honnêtement, si je voyais cela dans une revue de code, je devrais probablement le développeur réécrire ainsi:

Dim a as Object 
Dim i as Integer = 0 

For i=1 to 5 
    a = new Object() 
    'Do stuff 
Next 
+5

réglage En fait, la variable null peut provoquer la durée de vie de l'objet à être étendu plutôt que raccourci (http: // blogs. msdn.com/csharpfaq/archive/2004/03/26/97229.aspx). Bien que le message général de la poste soit correct - ne vous embêtez pas à mettre les choses à zéro. –

+0

Touche. Le .NET JIT continue de me surprendre par son intelligence et son efficacité! –

2

Non, vous n'en avez pas besoin. .NET a la garbage collection. Et comme il semble que ce code se trouve dans une portée de méthode, la garbage collection nettoie toutes les variables locales.

5

Il n'est presque jamais nécessaire d'affecter explicitement Nothing à une variable. Le travail du garbage collector est de prendre soin de l'allocation de mémoire pour vous, spécifiquement pour vous décharger de cette responsabilité. Donc non, vous n'avez pas besoin d'assigner a = Nothing à l'intérieur de la boucle.

Vous n'avez pas non plus besoin du bloc try/finally qui affecte Rien autour de tout. C'est vraiment juste un encombrement supplémentaire que le système d'exécution prendra en charge de toute façon.

0

Comme tout le monde indiqué ci-dessus, vous n'avez pas besoin de définir explicitement vos variables à rien, car il est géré automatiquement . Toutefois, si pour une raison quelconque vous voulez forcer le GC à collecter, vous pouvez exécuter ceci:

System.GC.Collect() 
+0

Forcer la collecte des ordures est probablement une très mauvaise idée. (C'est certainement en Java! 0 –