Nous avons eu un peu de code ici (dans VS2005 et C#2.0) où le précédent ingénieurs sont sortis de leur manière d'utiliser list.ForEach( delegate(item) { foo;});
au lieu de foreach(item in list) {foo; };
pour tout le code qu'ils ont écrit. par exemple, un bloc de code pour la lecture des lignes à partir d'un dataReader.
Je ne sais toujours pas exactement pourquoi ils ont fait cela.
Les inconvénients de l' list.ForEach()
sont:
Il est plus prolixe en C# 2.0. Toutefois, en C# 3-delà, vous pouvez utiliser le "=>
" syntaxe pour faire bien laconique expressions.
Il est moins familier. Les personnes qui ont à maintenir ce code me demande pourquoi vous l'avez fait de cette façon. Il m'a fallu un certain temps pour décider qu'il n'y avait aucune raison, sauf peut-être pour faire de l'écrivain judicieux (la qualité du reste du code miné). Il a également été moins lisible, avec le "})
" à la fin du délégué bloc de code.
Voir aussi le projet de Loi de Wagner livre "Effective C#: 50 Moyens Spécifiques pour Améliorer Votre C#", où il parle de pourquoi foreach est préféré à d'autres boucles comme pour la ou les boucles "while" - le point principal est que vous êtes de laisser le compilateur décider de la meilleure façon de construire la boucle. Si une future version du compilateur gère à utiliser une technique plus rapide, vous obtiendrez gratuitement en utilisant foreach et de reconstruction, plutôt que de changer votre code.
un foreach(item in list)
construire vous permet d'utiliser break
ou continue
si vous avez besoin de sortir de l'itération ou la boucle. Mais vous ne pouvez pas modifier la liste à l'intérieur d'une boucle foreach.
Je suis surpris de voir qu' list.ForEach
est légèrement plus rapide. Mais ce n'est probablement pas une raison valable pour l'utiliser dans tout , que serait prématuré d'optimisation. Si votre application utilise une base de données ou un service web, pas de contrôle de la boucle, est presque toujours va être où le temps passe. Et avez-vous comparé contre une for
boucle de trop? L' list.ForEach
pourrait être plus rapide en raison de l'aide qu'à l'interne et à un for
boucle sans l'emballage serait encore plus rapide.
Je suis en désaccord que l' list.ForEach(delegate)
version est "la plus fonctionnelle" de manière significative. Il passe d'une fonction à une fonction, mais il n'y a pas de grande différence dans le résultat ou le programme de l'organisation.
Je ne pense pas qu' foreach(item in list)
"dit exactement comment vous voulez qu'il fait" - for(int 1 = 0; i < count; i++)
boucle n'est qu'un foreach
boucle laisse le choix de contrôler jusqu'à le compilateur.
Mon sentiment est sur un nouveau projet, d'utiliser foreach(item in list)
pour la plupart des boucles pour adhérer à l'usage commun et pour des raisons de lisibilité, et d'utiliser list.Foreach()
seulement pour les blocs courts, quand vous pouvez faire quelque chose de plus élégamment ou de manière compacte avec le C# 3 "=>
" de l'opérateur. Dans de tels cas, il peut y avoir une extension LINQ méthode qui est plus spécifique que l' ForEach()
. Voir si Where()
, Select()
, Any()
, All()
, Max()
ou une des nombreuses autres méthodes LINQ n'est pas déjà faire ce que vous voulez à partir de la boucle.