2017-10-09 5 views
4

私のユーティリティのいずれかで、先日、ReSharperのは、デリゲートThreadStartを定義することラムダを述べる以下のコードの一部について私を示唆したローカル関数に変換することができます:C#7ローカル関数のlambdaに対するメリットは何ですか?

:に変換

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(); 
    } 
} 

ので、

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(); 
    } 
} 

前者に比べて後者のメリットは何ですか?パフォーマンスについてのみですか?

Iすでに下のリソースをチェックしましたが、私の例ではメリットがその明白ではありません。

+0

私は近いと言うでしょう。しかし、それは本当に興味深い質問です。 :-) –

+1

ローカル関数はlambdaを使って1行で再帰をサポートしていますが、これを行うにはちょっとトリックする必要があります。また、クロージャをキャプチャするときにlambdasのようにガベージを作成しません。 –

+2

@AlKeppこれは**の意見ではなく、地方の機能のメリットについての質問です。 OPがあなたの好きなことを聞​​いていたら質問は意見に基づいています。明らかにそれはしません。 –

答えて

5

リンク先の第一のウェブサイトは、地元のいくつかの利点を言及関数:
- ラムダによって割り当てが行われます。
- 再帰的ラムダを書く上品な方法はありません。
- 彼らはyield returnとおそらく他のものを使用できません。

間違った方法:

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; 
} 

正しい方法:

一つの有用なユースケースがイテレータである、意見ベースであるため

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

ローカル関数としてのイテレータは、lambda上のローカル関数の大きな利点です。+1 –

+0

@Dennis_E:これは素晴らしい改善です! – Ehouarn

+0

* 'ref'、' out'、 'params'、オプションのパラメータはありません。なぜなら私は 'ref'、' out'、 'params'とオプションのパラメータをラムダで実装することができるからです。 – PetSerAl

関連する問題