最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在C#9 中使用static匿名函數(shù)

 更新時(shí)間:2021年03月31日 11:51:05   作者:碼農(nóng)讀書(shū)  
這篇文章主要介紹了如何在C#9中使用static匿名函數(shù),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

匿名函數(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#檢測(cè)是否有u盤(pán)插入的方法

    C#檢測(cè)是否有u盤(pán)插入的方法

    這篇文章主要介紹了C#檢測(cè)是否有u盤(pán)插入的方法,涉及C#操作硬件的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C#實(shí)現(xiàn)在啟動(dòng)目錄創(chuàng)建快捷方式的方法

    C#實(shí)現(xiàn)在啟動(dòng)目錄創(chuàng)建快捷方式的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)在啟動(dòng)目錄創(chuàng)建快捷方式的方法,涉及C#快捷方式的創(chuàng)建技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • C# XML操作類(lèi)分享

    C# XML操作類(lèi)分享

    這篇文章主要分享了C# XML操作類(lèi)的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#中sizeof的用法實(shí)例分析

    C#中sizeof的用法實(shí)例分析

    這篇文章主要介紹了C#中sizeof的用法,包括了常見(jiàn)的用法及注釋事項(xiàng),需要的朋友可以參考下
    2014-09-09
  • C#12中的Collection expressions集合表達(dá)式語(yǔ)法糖詳解

    C#12中的Collection expressions集合表達(dá)式語(yǔ)法糖詳解

    C#12中引入了新的語(yǔ)法糖來(lái)創(chuàng)建常見(jiàn)的集合,并且可以使用..來(lái)解構(gòu)集合,將其內(nèi)聯(lián)到另一個(gè)集合中,下面就跟隨小編一起學(xué)習(xí)一下C#12中這些語(yǔ)法糖的使用吧
    2023-11-11
  • C#多線(xiàn)程之Semaphore用法詳解

    C#多線(xiàn)程之Semaphore用法詳解

    這篇文章主要為大家詳細(xì)介紹了C#多線(xiàn)程之Semaphore用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Python設(shè)計(jì)模式編程中的備忘錄模式與對(duì)象池模式示例

    Python設(shè)計(jì)模式編程中的備忘錄模式與對(duì)象池模式示例

    這篇文章主要介紹了Python設(shè)計(jì)模式編程中的備忘錄模式與對(duì)象池模式,文中分別舉了表單和線(xiàn)程的相關(guān)示例,需要的朋友可以參考下
    2016-02-02
  • c# BackgroundWorker使用方法

    c# BackgroundWorker使用方法

    這篇文章主要介紹了c# BackgroundWorker使用方法,文中代碼非常詳細(xì),幫助大家更好的參考學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C#比較兩個(gè)List集合內(nèi)容是否相同的幾種方法

    C#比較兩個(gè)List集合內(nèi)容是否相同的幾種方法

    本文詳細(xì)介紹了在C#中比較兩個(gè)List集合內(nèi)容是否相同的方法,包括非自定義類(lèi)和自定義類(lèi)的元素比較,對(duì)于非自定義類(lèi),可以使用SequenceEqual、排序后比較或HashSet來(lái)忽略重復(fù)元素,對(duì)于自定義類(lèi),需要重寫(xiě)Equals和GetHashCode方法,然后使用相應(yīng)的比較方法
    2025-02-02
  • C#類(lèi)的成員之Field字段的使用

    C#類(lèi)的成員之Field字段的使用

    本文主要介紹了C#類(lèi)的成員之Field字段的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評(píng)論

丰顺县| 乐安县| 庆阳市| 湖口县| 琼中| 渝北区| 永仁县| 砚山县| SHOW| 彭山县| 锦州市| 江永县| 嘉兴市| 汉川市| 连南| 建平县| 醴陵市| 新绛县| 商丘市| 年辖:市辖区| 云龙县| 潼南县| 宣汉县| 上蔡县| 余庆县| 修武县| 潼南县| 滦平县| 积石山| 信阳市| 临洮县| 芜湖县| 盘锦市| 武冈市| 集安市| 郸城县| 蓝田县| 新余市| 翁源县| 永和县| 类乌齐县|