溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-03-31 15:28:34 來(lái)源:億速云 閱讀:162 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

static匿名函數(shù)怎么在C#9 中使用?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

匿名方法的代價(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)懵的話,使用下面的例子加深理解。

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ù)不能訪問(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ì)看到如下的輸出。

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

為了避免這種內(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)。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI