C 9中使用靜態匿名函式

2022-06-20 14:57:20 字數 1959 閱讀 7340

匿名函式是很早以前在c#程式語言中引入的。儘管匿名功能有很多好處,但它們並不便宜。避免不必要的分配很重要,這就是為什麼在c#9中引入靜態匿名函式的原因。在c#9中,lambda或匿名方法可以具有靜態修飾符。

一、在visual studio中建立控制台應用程式專案

首先,讓我們在visual studio中建立乙個.net core控制台應用程式專案。這將在visual studio 2019中建立乙個新的.net core控制台應用程式專案。我們將在本文的後續部分中使用此專案。

二、匿名方法並不簡單

您有呼叫**的開銷。例如,如果您的lambda捕獲了封裝方法的區域性變數或引數,則將有兩個堆分配-乙個分配給委託,另乙個分配給閉包。或者,如果您的lambda僅捕獲乙個封閉的例項狀態,則將僅產生乙個委託分配,並因此產生乙個堆分配。如果您的lambda不捕獲任何內容,或僅捕獲靜態狀態,則將產生0個堆分配。

讓我們通過乙個例子來理解這一點。請考慮以下**片段,該**片段說明了如何在**中意外分配。

int y = 1;

mymethod(x => x + y);

上面的**傾向於捕獲y,從而導致意外分配。

您可以利用const和static關鍵字來防止這種不必要的分配,如下面的**段所示。

const int y = 1;

mymethod(static x => x + y);

為了避免不必要和浪費的記憶體分配,我們可以在lambda上使用static關鍵字,並在不想捕獲的變數或物件上使用const關鍵字。請注意,靜態匿名函式無法從封閉範圍訪問本地,引數或「 this」例項,但它們可以從封閉範圍引用靜態成員以及常量定義(請參閱microsoft文件)。

接下來的部分將更詳細地說明靜態匿名函式。

三、什麼是靜態匿名方法?

靜態匿名函式或方法是c#9中匿名函式的改進。您現在可以使用static關鍵字建立靜態匿名函式。

應用於lambda或匿名函式的靜態修飾符稱為靜態匿名函式。靜態匿名方法可以引用靜態成員,也可以引用封閉範圍中的常量物件。

應當注意,靜態匿名方法無法從封閉範圍捕獲狀態。這意味著不能從靜態匿名函式中訪問與封閉範圍有關的區域性變數,引數和「this」例項。非靜態本地方法能夠從封閉的靜態匿名方法捕獲狀態資訊,但無法捕獲封閉的靜態匿名函式之外的狀態。

請參考以下**片段。

class program  }

public class demo

是由微軟在2023年開發的。";

void displaytext(funcfunc)

public void display()

}

變數formattedtext將由名為displaytext的匿名方法捕獲,這又將導致您可能不需要的記憶體分配。

當您執行上述程式時,輸出將顯示在控制台視窗中,如下圖所示。

要禁止分配,可以在formattedtext變數上使用const關鍵字,在lambda函式上使用static修飾符,如下面的**片段所示。

public class demo2

是由微軟在2023年開發的。";

void displaytext(funcfunc)

public void display()

}

在lambda或匿名方法上使用靜態修飾符的功能是c#9中新增的功能。當您將靜態修飾符新增到lambda或匿名方法時,lambda或匿名方法被稱為靜態匿名函式。 。

您可以在lambda或匿名方法上利用static修飾符,以確保您不會無意中從封閉的上下文中捕獲本地或例項狀態。這對於提高應用程式的效能非常友好。

**於

C 中使用非靜態成員函式代替全域性函式

我們需要一組功能函式,但又不想使用全域性函式,以免汙染命名空間,當然可以使用命令空間,也可以使用靜態成員函式,但我們還有一種另類的方法,使用非靜態成員函式。如下類 class util 我們只用於使用該類組織 但從不進行例項化 util public static float version voi...

匿名類中在Json中使用

匿名類 1.第一步 定義乙個類,類中有三個屬性id。name.height 屬性型別根據 右邊的值來推斷 2.第二步 建立這個類的物件,然後,用變數p1去指向它 3.var 表示根據右邊的型別去推斷var的型別 using system using system.collections.generi...

C 中的匿名函式

c 中有個叫做 泛型 的東西,就是說只是個殼,到底是int,string,bool還是什麼型別,不知道,所以我們用個 t 表示。請看下面 declare the generic class public class genericlist class testgenericlist static v...