2017-10-09 12 views
4

L'autre jour, dans un de mes services, ReSharper me a laissé entendre sur le morceau de code ci-dessous indiquant que lambda définissant le délégué ThreadStart peut être transformé en une fonction locale:Quels sont les avantages des fonctions locales C# 7 par rapport à lambdas?

public void Start(ThreadPriority threadPriority = ThreadPriority.Lowest) 
{ 
    if (!Enabled) 
    { 
     _threadCancellationRequested = false; 

     ThreadStart threadStart =() => NotificationTimer (ref _interval, ref _ignoreDurationThreshold, ref _threadCancellationRequested); 

     Thread = new Thread(threadStart) {Priority = ThreadPriority.Lowest}; 
     Thread.Start(); 
    } 
} 

Et donc transformé en:

public void Start(ThreadPriority threadPriority = ThreadPriority.Lowest) 
{ 
    if (!Enabled) 
    { 
     _threadCancellationRequested = false; 

     void ThreadStart() => NotificationTimer(ref _interval, ref _ignoreDurationThreshold, ref _threadCancellationRequested); 

     Thread = new Thread(ThreadStart) {Priority = ThreadPriority.Lowest}; 
     Thread.Start(); 
    } 
} 

Quels sont les avantages de ces derniers par rapport aux premiers, ne s'agit-il que de performances?

je l'ai déjà vérifié les ressources ci-dessous, mais dans mon exemple, les avantages ne sont pas si évident:

+0

je dirais que près parce qu'elle est fondée sur des opinions. Mais c'est une question vraiment intéressante. :-) –

+1

les fonctions locales supportent la récursion en une ligne, avec lambdas vous devez faire un petit truc pour le faire, elles ne créent pas non plus de détritus comme le font les lambdas lors de la capture des fermetures. –

+2

@AlKepp c'est ** pas ** basé sur l'opinion, la question se pose sur les avantages des fonctions locales, sinon pourquoi auraient-ils même introduit la fonction locale. question serait fondée sur l'opinion si OP demandaient ce que vous préférez. il est clair que non. –

Répondre

5

Le 1er site Internet dont vous mentionne quelques avantages de locaux fonctions:
- Un lambda provoque l'allocation.
- Il n'y a pas de façon élégante d'écrire un lambda récursif. Ils ne peuvent pas utiliser yield return et probablement d'autres choses.

Un cas d'utilisation est utile itérateurs:

mauvais sens:

public static IEnumerable<T> SomeExtensionMethod<T>(this IEnumerable<T> source) { 
    //Since this method uses deferred execution, 
    //this exception will not be thrown until enumeration starts. 
    if (source == null) 
     throw new ArgumentNullException(); 
    yield return something; 
} 

chemin droit:

public static IEnumerable<T> SomeExtensionMethod<T>(this IEnumerable<T> source) { 
    if (source == null) 
     throw new ArgumentNullException(); 
    return Iterator(); 

    IEnumerable<T> Iterator() { 
     yield return something; 
    } 
} 
+2

itérateurs comme fonctions locales est énorme avantage des fonctions locales sur lambdas +1 –

+0

@Dennis_E: d'accord c'est une belle amélioration! – Ehouarn

+0

* non 'ref',' out', 'params', paramètres optionnels * Pouvez-vous fournir une référence pour cela? Parce que je suis capable d'implémenter des délégués avec 'ref',' out', 'params' et des paramètres optionnels avec lambda. – PetSerAl