2009-07-03 5 views
0

Étant donné les exemples d'installation et de code ci-dessous, quelles raisons pouvez-vous proposer pour utiliser l'un plutôt que l'autre? J'ai quelques arguments en utilisant l'un ou l'autre, mais je suis curieux de savoir ce que les autres pensent.Conserver des références d'objet

Configuration

public class Foo 
{ 
    public void Bar() 
    { 
    } 
} 

Snippet Un

var foo = new Foo(); 
foo.Bar(); 

Snippet Deux

new Foo().Bar(); 

Répondre

9

La première version signifie que vous pouvez examiner foo dans un débogueur plus facilement avant d'appeler Bar().

La première version signifie également que vous associer un nom à l'objet (il est en fait le nom de la variable bien sûr, mais il y a clairement une association mentale) qui peut être utile à certains moments:

var customersWithBadDebt = (some big long expression) 
customersWithBadDebt.HitWithBaseballBat(); 

est plus claire que

(some big long expression).HitWithBaseballBat(); 

Si aucune de ces raisons ne s'applique, n'hésitez pas à opter pour la version mono-ligne bien sûr. C'est le goût personnel qui est ensuite appliqué à chaque contexte spécifique.

+0

Vraiment de bons points. –

3

Si vous ne comptez pas utiliser l'instance Foo pour plus que de simplement faire cet appel je le ferais probablement aller pour le second, mais je ne vois pas qu'il devrait y avoir une différence pratique, sauf si l'appel arrive extrêmement souvent (mais cela ne me semble pas très probable avec cette construction).

+0

Ceci est un élément que j'étais à éludant. Y a-t-il des différences fonctionnelles? Le GC a-t-il plus de facilité à se débarrasser de l'un par rapport à l'autre? –

+0

Peut être instructif d'examiner l'IL émis dans chaque cas. – AakashM

+0

Je doute que le GC trouvera l'un d'eux plus difficile à traiter que l'autre; cela dépend probablement plus de ce que vous choisissez de faire avec la référence que vous stockez dans le premier exemple. –

0

Je préférerais le second car il est assez clair que je n'ai pas du tout besoin de la référence d'objet.

0

Je vous demanderais d'utiliser cette méthode comme instance. Si je ne faisais que rajouter de l'objet pour appeler une méthode et la rejeter par la suite, une méthode statique avec les dépendances de classes comme paramètres devrait être le chemin à parcourir (bien que je méprise la statique). Ce qui conduit au problème le plus intéressant: Si vous ne comptez pas du tout sur l'état interne, alors vous êtes juste une fonction et donc je dirais que vous appartenez à une entité, pas à votre propre classe.

+0

Cet exemple est sorti de travailler avec un XmlSerializer, donc la structure de la classe est déjà établie et est ce qu'elle est. Juste essayer de voir ce que les autres préférences étaient style. –

0

Je choisirais le numéro un.

Si vous allez avoir la classe Foo do Bar() puis Bar2() ce sera plus facile.

De plus il est plus facile à déboguer parce que vous pouvez regarder foo, quelque chose que vous ne pouvez pas avec extrait 2

Questions connexes