Func和Action委託簡單用法

2022-01-13 16:24:31 字數 2565 閱讀 4588

func和action類是特殊的型別,它們允許你在不必指定自定義委託型別的情況下,去使用委託。在整個.net框架中都可以使用它們。例如,在我們考察平行計算時,你也會看到這兩個類的示例。

上面一段文字是官方的一段翻譯。雖然看上去你不太容易能理解是什麼意思。的確委託糅合c#的很多概念在裡面,一時半會要真正理解其含義用途不是一件現實的事情。說實在的,我也是經歷很長的時間才理解委託的用途的,雖然不太全面。

網上關於c#委託的文章很多,大多數都只是說清楚了如何使用委託,但並未解釋為什麼它們是有用的。當然這篇文章也只是介紹func和action的簡單用法,如果你想對委託有更深刻的理解,我推薦看看這篇文章 

還是用簡單的語法快速地學會在c#中如何使用action和func。(看完之後,比你想象中要簡單n倍)

我們定義沒有返回值沒有引數的委託這樣的:

private delegate void eatrice(); //定義乙個eatrice委託型別
寫乙個無返回值無引數的函式:

private static void  eat()

然後宣告並呼叫:

static void main(string args)

問題來了:有沒有辦法不定義委託,直接呼叫呢?當然是可以的,直接用action

action是.net 內建的委託(f12之後有種被騙的感覺),有很16個過載,低版本好像沒這麼多

static void main(string args)

private static void eat()

還有action委託,說是有16個「過載」(其實這種說法不正確),也就是可以最多可以接收16個 t型別的引數

演示一下action接收兩個t型別的引數委託(action的委託重點是一定沒有返回值型別)

static void main(string args)

private static void eat(int num,string name)

個");

}

我們f12轉到定義看看,結果有點失望,原來也就是用delegate 關鍵字定義乙個action的名稱。國際慣例,還是發張圖

可以接匿名函式使用嗎?當然是可以的, lambda表示式也是可以的

static void main(string args)

個");

};eat(5,"蘋果");

}

lambda表示式:

actioneat = (num, name) =>

個");

};eat(5,"蘋果");

雖然上面只是告訴我們action如何使用,但是並沒有說明它的作用體現在**。寫乙個傳送請求的方法你就會知道它是有作用的

static void main(string args)

,//實現響應成功做哪些事情

erroraction => );//實現失敗做哪些事情

}private static void sendpost(actionerroraction,actionsuccessaction)

else

使用傳送請求方法的時候,將action委託作為引數去實現。這有點類似jquery的ajax 方法 error,success去**。

action 的委託沒有返回值,那要是有返回值的函式怎麼做,恰恰相反func就是專門解決這樣乙個事情的必須有返回值引數(0-16 t型別引數)

在不使用func委託時我們來寫乙個計算兩個int型別乘積的委託返回值是int。

private delegate int calc(int a,int b); //定義乙個calc委託型別 ,計算a*b

static void main(string args)

private static int calcmul(int a ,int b)

不使用delegate關鍵字宣告委託直接使用內建寫好的func關鍵字這樣就ok了。

static void main(string args)

private static int calcmul(int a ,int b)

func至少有乙個t型別引數作為返回值。規定是將最後乙個引數作為返回值。

func結合匿名方法和lambda表示式也是可以的。

static void main(string args)

;console.writeline(calc(10,45));

}

lambda表示式:

static void main(string args)

;console.writeline(calc(10,45));

}

至於func為什麼是很有作用,這個就不多寫了,和action差不多,委託還需要在實踐中不斷使用,就會發現這兩個玩意的經典之處。

的確,是不是比想象中要簡單許多。.net 中隨處可見委託,不會玩委託真的挺尷尬的。寫的有點雜,沒有說到的地方,還請各位見諒。

委託, 泛型委託,Func和Action

使用委託來做一些事情,大致思路是 1 定義宣告乙個委託,規定輸入引數和輸出型別。2 寫幾個符合委託定義的方法。3 把方法列表賦值給委託 4 執行委託 internal delegate int mydelegate class programconsole.readkey static ienume...

Func和Action委託的區別和簡單使用

前言 下面幾條都是根據自己開發經驗和網上資料整理總結的,初學者可適當入門學習,加深印象,高手請54.func和action委託的區別和簡單使用 1 兩種委託的常見形式和區別 1 func委託有5個過載形式,區別僅在於它所指向的方法的簽名的引數個數,分別如下 func func func func f...

Func和Action委託的區別和簡單使用

func和action委託的區別和簡單使用 1 兩種委託的常見形式和區別 1 func委託有5個過載形式,區別僅在於它所指向的方法的簽名的引數個數,分別如下 func func func uncfunc 其中t,t1,t4是委託指向的方法的引數的型別,tresult為方法的返回型別。2 action...