La fonction locale vs Lambda C# 7.0
Je suis en train de regarder les nouvelles mises en oeuvre dans C# 7.0 et je trouve intéressant qu'ils ont mis en œuvre des fonctions locales, mais je ne peux pas imaginer un scénario où une fonction locale serait préférée à une expression lambda, et quelle est la différence entre les deux.
Je ne comprends que les lambdas sont anonymous
fonctions en attendant les fonctions locales ne sont pas, mais je ne peux pas comprendre un scénario réel, où la fonction locale a des avantages sur les expressions lambda
Un exemple serait très apprécié. Merci.
- Les génériques, des paramètres, des fonctions récursives, sans avoir à initialiser le lambda null, etc.
- Vous devriez poster cela comme une réponse.
Vous devez vous connecter pour publier un commentaire.
Ceci s'explique par Mads Torgersen en C# Design Notes de Réunion où les fonctions ont d'abord été discuté:
À développer un peu plus, les avantages sont:
Performance.
Lors de la création d'un lambda, un délégué doit être créé, ce qui est inutile, de l'allocation dans ce cas. Les fonctions locales sont vraiment juste des fonctions, pas de délégués sont nécessaires.
Aussi, les fonctions locales sont plus efficaces pour la capture de variables locales: les lambdas généralement la capture de variables dans une classe, tandis que les fonctions peuvent utiliser un struct (passé à l'aide de
ref
), ce qui évite une allocation.Cela signifie également d'appeler des fonctions locales est moins cher et ils peuvent être inline, ce qui pourrait accroître encore plus les performances.
Local, les fonctions peuvent être récursives.
Lambdas peuvent être récursifs trop, mais il nécessite maladroit code, si vous commencez par attribuer
null
à un délégué de la variable, puis le lambda. Les fonctions locales peuvent naturellement être récursive (y compris mutuellement récursives).Fonctions locales peuvent être génériques.
Lambdas ne peut pas être générique, car ils doivent être assignée à une variable avec un type de béton (ce type peuvent utiliser générique variables à partir de l'extérieur de la portée, mais ce n'est pas la même chose).
Fonctions locales peuvent être mises en œuvre comme un itérateur.
Lambdas ne peut pas utiliser le
yield return
(etyield break
) mot-clé pour mettre en œuvreIEnumerable<T>
-retour de fonction. Les fonctions locales peut.Fonctions locales regarder mieux.
Ce n'est pas mentionné dans la citation ci-dessus et peut-être juste ma préférence personnelle, mais je pense que la normale de la syntaxe de la fonction, c'est mieux que l'affectation d'un lambda à un délégué de la variable. Les fonctions locales sont également plus succincte.
Comparer:
Func<int, int, int> f = (x, y) => x + y; f(arg1:1, arg2:1);
.object
. Ainsi, elles pourraient utiliser une structure, mais il devrait être mis en boîte, donc vous devez toujours avoir une allocation supplémentaire.En plus de svick de la grande réponse il y a un avantage de plus pour les fonctions locales:
Ils peuvent être définis de n'importe où dans la fonction, même après la
return
déclaration.#region Helpers
à la fin de la fonction, afin d'éviter l'encombrement à l'intérieur de cette fonction et surtout éviter l'encombrement dans la classe principale.Si vous aussi vous vous demandez comment tester la fonction locale, vous devriez vérifier JustMock qu'il dispose de la fonctionnalité de le faire. Voici un simple exemple de classe qui seront testées:
Et voici comment le test recherche:
Voici un lien vers JustMock la documentation.
Avertissement. Je suis l'un des développeurs responsables de JustMock.
.DoNothing().OccursOnce();
Et, plus tard, affirmer que l'appel a été fait par l'appel de laMock.Assert(foo);
méthode. Si vous êtes intéressé à la façon dont d'autres scénarios sont pris en charge vous pouvez lire notre Affirmant Occurrence de l'aide de l'article.- Je utiliser les fonctions inline pour éviter la collecte des ordures pression spécialement lorsque vous traitez avec de plus en cours d'exécution des méthodes. Dire que l'on souhaite obtenir 2 ans, ou les données du marché pour un symbole. Aussi, on peut emballer beaucoup de fonctionnalités et une logique d'entreprise si on a besoin d'.
ce que l'on ouvre une socket de connexion au serveur et en boucle sur les données de la liaison d'un événement pour un événement. On peut penser de la même manière qu'une classe est conçu, un seul n'est pas l'écriture de méthodes d'assistance partout qui sont vraiment seulement pour une pice de fonctionnalité. ci-dessous quelques exemples de la façon dont cela pourrait ressembler, veuillez noter que je suis à l'aide de variables et de l ' "aide" méthodes sont en dessous de la enfin. En la Finalement j'ai bien supprimer les gestionnaires d'événements, si je Change de classe serait externe/injectés je n'aurais aucune attente de gestionnaire d'événement fondé
Vous pouvez voir les avantages, comme mentionné ci-dessous, vous pouvez voir ici un exemple de mise en œuvre. L'espoir qui aide à expliquer les avantages.