如何在C#9 中使用static匿名函數
匿名函數 在 C# 中已經出現很多年瞭,雖然匿名函數用起來很爽,但代價是不小的,為瞭避免不必要那些你意想不到的內存分配,這就是為什麼 C#9 中引入 static 匿名函數的原因,這篇文章我們將會討論如何使用 靜態匿名函數 以及為什麼要用。
匿名方法的代價
匿名方法代價不低,因為它有 委托調用 方面的開銷,什麼意思呢?如果你的 lambda 裡需要捕獲封閉方法的局部變量或者參數,那麼就會存在兩種堆分配,一種是委托上的分配,另一種是閉包上的分配,如果你的 lambda 僅僅捕獲一個封閉方法的實例狀態,那麼僅會有委托分配,如果你的 lambda 什麼都不捕獲或者僅捕獲一個靜態狀態,那麼就沒有任何分配。
如果你有點懵的話,使用下面的例子加深理解。
int y = 1; MyMethod(x => x + y);
上面代碼的 lambda 中需要獲取 y,所以就有瞭意想不到的堆分配,要想解決,可以將 y 定義為 const 或者 static 來避免這種不必要的分配開銷,修改代碼如下:
const int y = 1; MyMethod(static x => x + y);
為瞭避免這種不必要和浪費內存的分配,可以在 lambda 上使用 static 關鍵詞 及 變量上標註 const,值得註意的是,static 匿名函數不能訪問封閉方法的局部變量和參數和 this 指針,但可以引用它的 靜態方法 和 常量。
C#9 中使用靜態匿名方法
先看一下例子:
public class Demo { private string formattedText = "{0} It was developed by Microsoft's Anders Hejlsberg in the year 2000."; void DisplayText(Func<string, string> func) { Console.WriteLine(func("C# is a popular programming language.")); } public void Display() { DisplayText(text => string.Format(formattedText, text)); Console.Read(); } } class Program { static void Main(string[] args) { new Demo().Display(); Console.Read(); } }
上面的例子中,formattedText變量會被 DisplayText 方法中的 func 所捕獲,這也就意味著它會產生你意料之外的內存分配,把程序跑起來之後,會看到如下的輸出。
為瞭避免這種內存分配,你隻需要做兩件事。
- formattedText 上標記 const。
- lambda 上標記 static。
所以修改後的代碼如下:
public class Demo { private const string formattedText = "{0} It was developed by Microsoft's Anders Hejlsberg in the year 2000."; void DisplayText(Func<string, string> func) { Console.WriteLine(func("C# is a popular programming language.")); } public void Display() { DisplayText(static text => string.Format(formattedText, text)); Console.Read(); } }
現在就沒有任何你意料之外的分配瞭,我想這也是你想要的。
現在你可以使用 static + const 組合來提升應用程序性能瞭,同時也可以有效的阻止在 lambda 中誤用封閉方法中的局部變量和參數引發的不必要開銷。
以上就是如何在C#9中使用static匿名函數的詳細內容,更多關於C#9 中使用static匿名函數的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- None Found