2010-11-17 11 views
0

Comment le CPG élimine-t-il les objets créés dans les 2 scénarios suivants?Mise au rebut d'objets

1)

Private Function DoSomething() As Boolean 
    Return New DatabaseManager().Insert() 
End Function 

2)

Private Function DoSomething() As Boolean 
    Dim mngr As New DatabaseManager() 
    Return mngr.Insert() 
End Function 

Dans l'option 1, je ne crée pas la variable locale pour maintenir la référence de l'objet. Dans l'option 2, je tiens la référence dans la variable locale.

Quelle option est la meilleure et pourquoi? (Le cas échéant)

Répondre

4

Comme vous pouvez le voir, dans l'option 1, je ne créer une variable locale pour maintenir la référence de l'objet

Vous pourriez ne pas être en train de créer explicitement, mais croyez-moi au Le niveau IL qui est ce que le compilateur émet est une instance de l'objet créé car vous ne pouvez pas appeler une méthode d'instance sur un objet sans instance.

Ceux-ci sont équivalents en termes de garbage collection et probablement le compilateur l'optimisera. Et parce qu'ils sont équivalents bien sûr, le préféré est celui qui implique moins de code et est plus lisible pour vous. Pour moi c'est le premier mais ça peut être subjectif, donc c'est vraiment à toi de décider.

+1

Il est tout à fait possible, au niveau IL, de créer un objet sans le stocker dans une variable locale. L'objet est renvoyé sur la pile, donc si vous ne l'utilisez qu'une fois, rien n'empêche un compilateur de supprimer les inutiles 'stloc.0' et' ldloc.0'. – cHao

+0

@cHao, très bonne remarque, point pris. Je vais mettre à jour mon message. –

2

Il n'y a pas de différence, le compilateur JIT va générer exactement le même code machine pour les deux. L'objet DataBaseManager sera visible par le garbage collector, généralement stocké dans un registre CPU en tant que référence Me dans la méthode Insert. Tout GC qui fonctionne après le nettoiera.