2010-03-26 8 views
3

Je vois certaines personnes écrivent:listes génériques avec Accès notation délégué

//wordList is List<string> 
wordList.ForEach(delegate(string word){ Console.WriteLine(word);}); 

au lieu de:

foreach(string word in wordList) 
{ 
    Console.WriteLine(word); 
} 

Quel est l'avantage à le faire. De plus, je ne pouvais pas comprendre la syntaxe des délégués d'action donnée ci-dessus bien que j'aie utilisé des délégués en C# 2.0. Fondamentalement, je ne suis pas en mesure de relier la syntaxe avec le concept de délégués que je connais. Pouvez-vous s'il vous plaît m'aider à comprendre la syntaxe. Est-ce un raccourci?

+1

Il n'y a aucun avantage particulier à cet exemple, et ce n'est pas très bon style C#. – mquander

Répondre

2

La syntaxe delegate() {...} est disponible dans .NET 2. Il crée essentiellement une méthode (anonyme) dans la classe contenant qui a le contenu du délégué. Ainsi, la syntaxe ci-dessus est équivalente à

private void actionImpl(string word) { 
    Console.WriteLine(word); 
} 

wordList.ForEach(new Action<string>(actionImpl)); 

En ce qui concerne , Eric Lippert has blogged about this. C'est utile pour quand une action n'a pas d'effets secondaires & est un très simple doublure. En utilisant la création implicite délégué & groupes de méthode, vous pouvez réduire votre exemple de code à

wordList.ForEach(Console.WriteLine); 

comme Console.WriteLine(string s) matchs la signature des délégués Action<string>. C'est moins de code et (je dirais) plus clair que d'utiliser une boucle explicite foreach, dans ce cas particulier.

2

Eric Lippert a blogged about exactly this topic.

Vous devez absolument lire l'article, mais de résumer brièvement l'un de ses points clés, il suggère que: expressions dont le seul but est de produire des effets secondaires doivent être relevés. La prémisse ici est que la création d'une extension fonctionnelle pour une boucle foreach ajoute peu de puissance expressive au langage, et peut être nuisible dans certains cas.

Je cite son article:

Lorsque nous fournissons deux façons subtilement différentes de faire exactement la même chose, nous de la confusion dans l'industrie, nous rendre plus difficile pour les gens à lire chaque autres de code, et ainsi de suite. Parfois, le avantage en ayant deux différentes représentations textuelles pour une opération (comme expressions de requête par rapport à leur forme appel de méthode sous-jacente ou + contre String.Concat) est si énorme qu'il vaut la peine de confusion, le potentiel. Mais l'avantage convaincant des expressions de requête est leur lisibilité ; cette nouvelle forme de "foreach" n'est certainement pas plus lisible que la forme "normale" et est sans doute pire.

0

La syntaxe déléguée est l'utilisation d'une fonction anonyme.

Il vous permet de définir la fonction en ligne pour aider à clarifier votre code. Vous pouvez trouver une explication plus détaillée sur msdn: http://msdn.microsoft.com/en-us/library/bb882516.aspx

0

Le premier est plus d'un style fonctionnel de programmation. Il laisse les détails de mise en œuvre de la façon dont chaque mot est imprimé au système sous-jacent. Bien que cela ne soit probablement pas dans votre exemple, cela laisse le système en train de faire des optimisations (la parallélisation étant un élément clé) sur les détails d'implémentation alors que la seconde ne le fait pas.

Dans le premier exemple, vous dites au système "Faites ceci à chaque élément". Dans le deuxième exemple, vous dites "Bouclez cette collection et faites-le". Le livre Real World Functional Programming parle de la différence entre les deux styles.

0

Si vous ne transmettez pas Action<string> instances entre les méthodes, il n'y a aucun avantage à la syntaxe de délégué.

Questions connexes