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

        共 4181字,需瀏覽 9分鐘

         ·

        2021-03-31 21:32

        匿名函數(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)用 方面的開銷,什么意思呢?如果你的 lambda 里需要捕獲封閉方法的局部變量或者參數(shù),那么就會(huì)存在兩種堆分配,一種是委托上的分配,另一種是閉包上的分配,如果你的 lambda 僅僅捕獲一個(gè)封閉方法的實(shí)例狀態(tài),那么僅會(huì)有委托分配,如果你的 lambda 什么都不捕獲或者僅捕獲一個(gè)靜態(tài)狀態(tài),那么就沒有任何分配。

        如果你有點(diǎn)懵的話,使用下面的例子加深理解。


        int y = 1;
        MyMethod(x => x + y);

        上面代碼的 lambda 中需要獲取 y,所以就有了意想不到的堆分配,要想解決,可以將 y 定義為 const 或者 static 來(lái)避免這種不必要的分配開銷,修改代碼如下:


        const int y = 1;
        MyMethod(static x => x + y);

        為了避免這種不必要和浪費(fèi)內(nèi)存的分配,可以在 lambda 上使用 static 關(guān)鍵詞 及 變量上標(biāo)注 const,值得注意的是,static 匿名函數(shù)不能訪問封閉方法的局部變量和參數(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<stringstring> 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<stringstring> func)
                {
                    Console.WriteLine(func("C# is a popular programming language."));
                }
                public void Display()
                {
                    DisplayText(static text => string.Format(formattedText, text));
                    Console.Read();
                }
            }

        現(xiàn)在就沒有任何你意料之外的分配了,我想這也是你想要的。

        現(xiàn)在你可以使用 static + const 組合來(lái)提升應(yīng)用程序性能了,同時(shí)也可以有效的阻止在 lambda 中誤用封閉方法中的局部變量和參數(shù)引發(fā)的不必要開銷。

        譯文鏈接:https://www.infoworld.com/article/3609850/how-to-work-with-static-anonymous-functions-in-csharp-9.html







        回復(fù) 【關(guān)閉】學(xué)關(guān)
        回復(fù) 【實(shí)戰(zhàn)】獲取20套實(shí)戰(zhàn)源碼
        回復(fù) 【被刪】學(xué)個(gè)
        回復(fù) 【訪客】學(xué)
        回復(fù) 【小程序】學(xué)獲取15套【入門+實(shí)戰(zhàn)+賺錢】小程序源碼
        回復(fù) 【python】學(xué)微獲取全套0基礎(chǔ)Python知識(shí)手冊(cè)
        回復(fù) 【2019】獲取2019 .NET 開發(fā)者峰會(huì)資料PPT
        回復(fù) 【加群】加入dotnet微信交流群

        強(qiáng)烈推薦:超全C#幫助類,提升效率就靠它


        @所有人,20個(gè)Q幣,趕快領(lǐng)?。?/p>


        瀏覽 40
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 欧美色哟哟| 成人乱无码AV在线观看 | 午夜看片在线 | 91国自产在线观看 | 操逼内射视频 |