如何在C#9 中使用static匿名函數(shù)
匿名函數(shù) 在 C# 中已經(jīng)出現(xiàn)很多年了,雖然匿名函數(shù)用起來(lái)很爽,但代價(jià)是不小的,為了避免不必要那些你意想不到的內(nèi)存分配,這就是為什么 C#9 中引入 static 匿名函數(shù)的原因,這篇文章我們將會(huì)討論如何使用 靜態(tài)匿名函數(shù) 以及為什么要用。
匿名方法的代價(jià)
匿名方法代價(jià)不低,因?yàn)樗?委托調(diào)用 方面的開(kāi)銷(xiāo),什么意思呢?如果你的 lambda 里需要捕獲封閉方法的局部變量或者參數(shù),那么就會(huì)存在兩種堆分配,一種是委托上的分配,另一種是閉包上的分配,如果你的 lambda 僅僅捕獲一個(gè)封閉方法的實(shí)例狀態(tài),那么僅會(huì)有委托分配,如果你的 lambda 什么都不捕獲或者僅捕獲一個(gè)靜態(tài)狀態(tài),那么就沒(méi)有任何分配。
如果你有點(diǎn)懵的話(huà),使用下面的例子加深理解。
int y = 1; MyMethod(x => x + y);
上面代碼的 lambda 中需要獲取 y,所以就有了意想不到的堆分配,要想解決,可以將 y 定義為 const 或者 static 來(lái)避免這種不必要的分配開(kāi)銷(xiāo),修改代碼如下:
const int y = 1; MyMethod(static x => x + y);
為了避免這種不必要和浪費(fèi)內(nèi)存的分配,可以在 lambda 上使用 static 關(guān)鍵詞 及 變量上標(biāo)注 const,值得注意的是,static 匿名函數(shù)不能訪(fǎng)問(wèn)封閉方法的局部變量和參數(shù)和 this 指針,但可以引用它的 靜態(tài)方法 和 常量。
C#9 中使用靜態(tài)匿名方法
先看一下例子:
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變量會(huì)被 DisplayText 方法中的 func 所捕獲,這也就意味著它會(huì)產(chǎn)生你意料之外的內(nèi)存分配,把程序跑起來(lái)之后,會(huì)看到如下的輸出。

為了避免這種內(nèi)存分配,你只需要做兩件事。
- formattedText 上標(biāo)記 const。
- lambda 上標(biāo)記 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();
}
}
現(xiàn)在就沒(méi)有任何你意料之外的分配了,我想這也是你想要的。
現(xiàn)在你可以使用 static + const 組合來(lái)提升應(yīng)用程序性能了,同時(shí)也可以有效的阻止在 lambda 中誤用封閉方法中的局部變量和參數(shù)引發(fā)的不必要開(kāi)銷(xiāo)。
以上就是如何在C#9中使用static匿名函數(shù)的詳細(xì)內(nèi)容,更多關(guān)于C#9 中使用static匿名函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#操作SQLite數(shù)據(jù)庫(kù)方法小結(jié)
這篇文章介紹了C#操作SQLite數(shù)據(jù)庫(kù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
C# 向二進(jìn)制文件進(jìn)行讀寫(xiě)的操作方法
該例子使用 BinaryStream 和 BinaryWriter 對(duì)二進(jìn)制文件進(jìn)行讀寫(xiě)操作先上代碼再根據(jù)我理解的所分享給各位朋友2013-04-04
C# Redis學(xué)習(xí)系列(一)Redis下載安裝使用
這篇文章主要為大家分享了C# Redis學(xué)習(xí)系列教程第一篇, Redis下載、安裝、使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
詳解C#如何實(shí)現(xiàn)隱式類(lèi)型轉(zhuǎn)換
Result?類(lèi)型是許多編程語(yǔ)言中處理錯(cuò)誤的常用方式,包括?C#?的?dotNext?庫(kù)。在本文中,我們將通過(guò)例子回顧?C#?中?using?語(yǔ)句和隱式類(lèi)型轉(zhuǎn)換的使用,感興趣的可以了解一下2023-01-01
C#(.net)中按字節(jié)數(shù)截取字符串最后出現(xiàn)亂碼問(wèn)題的解決
這篇文章主要給大家介紹了關(guān)于C#(.net)中按字節(jié)數(shù)截取字符串最后出現(xiàn)亂碼問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06

