C# 9 Lambda小幅升級

C# 9的Lambdas將會有一個小的升級,包含兩個新特性。這兩個新特性都不會改變代碼的編寫方式,但都體現了開發人員的意圖。

Lambda丟棄參數允許開發人員顯式指定某些參數是不需要的,這樣可以防止編譯器對未使用的參數發出錯誤警告。事件處理器就可能出現這種情況,因爲事件處理器有可能不需要知道發送方是誰,有不需要知道對象參數是什麼。

button1.Click += (s, e) => ShowDialog(); 

通過替換參數,很容易就知道變量未被使用。

button1.Click += (_, _) => ShowDialog(); 

如果有必要,可以使用類型。

var handler = (object _, EventArgs _) => ShowDialog(); 

靜態匿名函數可作爲無法捕捉本地變量(包括參數)的Lambda或匿名函數。下面這個示例來自 最初的提議

int y = 10; 
someMethod(x => x + y); // 捕捉 'y', 導致不必要的資源分配. 

在C#中,引用本地變量的匿名函數需要分配一個臨時對象。本地參數會被移出方法,並移入到對象中,在當前執行的函數結束後,它將繼續存在。這是必要的,因爲匿名函數存在的時間可能比創建它的函數要長。

通過添加static關鍵字來表明匿名函數阻止這種內存分配。

int y = 10; 
someMethod(static x => x + y); // 錯誤! 

爲了修復這個錯誤,需要將變量y改成常量或靜態字段。

const int y = 10; 
someMethod(static x => x + y); // 好了 :-) 

以下是該特性的主要規則:

  • 靜態匿名函數無法從包含作用域捕獲到狀態。因此,局部變量、參數和包含作用域內的參數在靜態匿名函數中是不可用的。
  • 靜態匿名函數無法通過隱式或顯式this或base引用來引用實例成員。
  • 靜態匿名函數可以引用包含作用域內的靜態成員。
  • 靜態匿名函數可以引用包含作用域內的常量定義。
  • 在靜態匿名函數中的nameof()可以引用包含作用域內的局部變量、參數,或者this或base函數。

原文鏈接

C# 9: Minor Improvements for Lambdas

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章