2017-10-09 62 views
4

有一天,在我的公用事業公司之一,ReSharper的暗示我一下下面指出的λ定義委託ThreadStart的一段代碼可以變成一個本地函數:C#7本地函數相比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(); 
    } 
} 

,從而轉化爲:

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

後者對前者有什麼好處,僅僅是關於性能?

我已經檢查了以下資源,但在我的例子好處不是很明顯:

+0

我想說接近,因爲它是基於意見。但這是一個非常有趣的問題。 :-) –

+1

本地函數支持在一行中遞歸,而lambda需要做一些小技巧來做到這一點,它們在捕獲閉包時也不會像lambdas一樣創建垃圾。 –

+2

@AlKepp這不是基於**的意見,問題是關於本地功能的好處,否則爲什麼他們甚至會引入本地功能。如果OP詢問你喜歡什麼,問題將基於意見。顯然它不是。 –

回答

5

您鏈接的網站第一次提到了當地一些好處功能:
- lambda導致分配。
- 沒有優雅的寫遞歸lambda的方法。
- 他們不能使用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

* no'ref','out','params',可選參數*您能否提供這方面的參考?因爲我可以用'lambda'實現'ref','out','params'和可選參數。 – PetSerAl

相關問題