34 votes

Meilleure pratique pour créer des objets utilisés dans les boucles for / foreach


Quelle est la meilleure pratique pour gérer les objets dans les boucles for ou foreach? Devrions-nous créer un objet en dehors des boucles et le recréer à nouveau (en utilisant new ...) ou en créer un nouveau pour chaque itération de boucle?
Exemple:

 foreach(var a in collection)
{
  SomeClass sc = new SomeClass();
  sc.id = a;
  sc.Insert();
}
 

ou

 SomeClass sc = null;
foreach(var a in collection)
{
  sc = new SomeClass();
  sc.id = a;
  sc.Insert();
}
 

Ce qui est mieux?

67voto

Mark Byers Points 318575

La première façon est mieux comme ça plus traduit clairement la portée de la variable et permet d'éviter des erreurs de accidentellement à l'aide d'un objet en dehors de la champ d'application prévu.

L'une des raisons pour vouloir utiliser le formulaire deuxième est que si vous voulez sortir de la boucle et ont toujours une référence à l'objet que vous avez atteint la dernière dans la boucle.

Une bonne raison pour le choix de la deuxième forme est la performance. Il pourrait sembler à première vue que la deuxième méthode utilise moins de ressources ou que vous êtes seulement à la création d'un objet et de le réutiliser. Ce n'est pas le cas ici. La répétition de la déclaration d'une variable à l'intérieur d'une boucle ne consommez pas de ressources supplémentaires ou de cycles d'horloge de sorte que vous n'avez pas de gain en performances, avantages de la traction de la déclaration à l'extérieur de la boucle.

12voto

Eric Lippert Points 300275

Tout d'abord, je remarque que tu veux dire "la création de variables" quand vous dites que "la création d'objets". L'objet de référence dans les variables, mais ils ne sont pas les variables elles-mêmes.

Notez que le scénario que vous décrivez introduit une différence sémantique lorsque la boucle contient une fonction anonyme et la variable est un fermé de plus de extérieur varible de la fonction anonyme. Voir

http://ericlippert.com/2009/11/12/closing-over-the-loop-variable-considered-harmful-part-one/

pour plus de détails.

4voto

spoulson Points 13391

Je suis sûr que quelqu'un pourrait éliminer l'analyse MSIL, mais il n'y a pratiquement aucune différence perceptible dans l'exécution ou les performances. La seule chose que vous affectez est le stockage d'une référence d'objet.

Je dis de le garder propre et simple; déclarer la variable à l'intérieur de la boucle. Cela fournit le principe ouvert / fermé dans la pratique, vous savez donc la portée de la variable est utilisée et n'est pas réutilisée ailleurs. Dans la boucle suivante, la variable perd sa portée et est réinitialisée automatiquement.

3voto

Rune Points 4759

Vous créez un nouvel objet dans chaque itération de boucle dans les deux cas (puisque vous appelez new SomeClass() ).

La première approche indique clairement que sc n'est utilisé qu'à l'intérieur de la boucle, ce qui pourrait être un avantage du point de vue de la maintenance.

1voto

Jelle Points 212

Je pense que cela n'a pas d'importance pour les performances, mais je préfère le premier. J'essaie toujours de garder la déclaration et l'instanciation ensemble si possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X