C 匿名方法

2021-05-18 05:06:28 字數 1047 閱讀 7066

1,匿名方法

c#為委託提供一種機制,可以為委託定義匿名方法,匿名方法沒有名稱,編譯器會定指定乙個名稱

匿名方法中不能使用跳轉語句跳轉到該匿名方法的外部,也不能跳轉到該方法的內部。

也不能在匿名方法外部使用的ref和out引數

2,匿名方法的【λ(拉姆達)表示式】方式定義

c#3.0之後匿名方法可以使用λ表示式來進行定義

無論是拉姆達(lambda)表示式(事實上應該叫匿名函式)或是匿名類,都能歸屬到一種叫閉包的東西上面。

λ運算子 =>

左邊是引數,使用括號表達 (string param),可以是 (param)這樣不定義型別,編譯器會推斷出來,只有乙個引數的時候可以不使用括號

右邊是實現**,使用花括號,如果**只有一行,則不使用花括號和return關鍵字也可以,編譯器會為我們新增

這是λ表示式的簡單實現

string str1 = " 匿名方法外部 ";

string str2 = " 匿名方法內部 ";

mydelagate my = param => param + str1 + str2;

console.writeline(my(" 引數 "));

3,委託呼叫過程的協變和抗變

關於委託的返回型別和委託方法的引數傳遞,如果我們不能正確使用的時候,經常會發生「協變和抗變」的錯誤。

需要額外注意

返回型別:返回型別需要注意的是協變

方法的返回型別可以派生於委託定義的型別。

引數型別:引數型別需要注意的是抗變

向委託傳遞的引數型別可以派生於委託方法的引數型別

返回型別的協變

引數型別的抗變

//實際上繼承自a的型別b的例項可以轉化為a,而子類向父類轉化的過程,在預設情況下會有編譯錯誤

//如下**

a aa = new a();

b bb = new b();

//這句沒問題

aa = bb;

//子類向父類轉化的過程中存在問題

bb = aa;

以上協變和抗變都是由這個原因產生的

c 匿名方法用途 C 匿名方法

我們討論了使用委託來引用具有與委託相同簽名的任何方法。換句話說,您可以使用該委託物件呼叫可由委託引用的方法。匿名方法提供了一種將 塊作為委託引數傳遞的技術。匿名方法是沒有名稱的方法,只是主體。您無需在匿名方法中指定返回型別 它是從方法體內的return語句推斷出來的。編寫匿名方法 匿名方法是通過建立...

c 匿名方法用途 C 匿名方法

c 語言 的 c 匿名方法 前面我們學習過,委託可用於引用任何與委託簽名相同的方法。換句話說,可以呼叫可以由委託使用該委託物件引用的方法。匿名方法提供了一種將 塊作為委託引數傳遞的技術。匿名方法是沒有名稱的方法,只有方法體。不需要在匿名方法中指定返回型別 它是從方法體中的return語句來推斷的。編...

c 匿名方法

例如下面這兩個例子 不使用匿名方法的委託 using system using system.collections.generic using system.linq using system.text namespace delegate int otherdel int param publi...