如何理清 C# 委托、事件、Action、Func?
想要理清 C#委托、事件、Action、Func 這些名詞的區別,我們先搞清楚他們的關系。
第一步
所有的名詞,都是基于委托產生的,所以這個委托其實就是基礎,先要明白什么是委托。
委托的關鍵詞是 delegate ,具體在代碼中的使用方法如下:
為了方便新人理解,這里我直接用通俗點點方式說一下什么是委托:
委托實際上是函數的模板。此模板可用于放入具有相同格式的各種函數,即對這些實函數的引用。這就像聲明一個int變量public int Testint;然后可以為這個Testint賦值。只要它是一個整數,它實際上就是一個模板。只是你放入的只能是整數罷了,委托也可以用這種思路去理解。實際上,就是將函數放在模板格式中,這樣就可以通過模板直接調用要調用的函數。至于為什么要這么做,我們一起來看看:
第二步
我們現在知道了什么是委托,接下來說事件,其實事件就是委托的一種特殊封裝,事件本身其實就是一種特殊的委托。
為了方便大家快速理解,直接上代碼,先來看下普通的委托如何使用:
這張圖簡單的說了一下委托的用法,那么事件其實就是在上圖的使用過程中加了一個關鍵字event,如圖:
細心的學生應該發現,使用和不添加似乎沒有區別。是的,看起來是這樣的,但在實際使用過程中,如果添加了event,其他類中帶有event字段的delegation不能直接使用=賦值符號,只能使用 =。注意,在其他類中,如果您直接在聲明事件的類中,那么仍然可以直接使用=assignment。
又有同學要問啦,
為什么呢?其實原因也很簡單,當你在委托聲明的時候加了 event 字段之后,直接賦值的操作會變成 private 權限,那么自然在其他類中就無法直接賦值了,為什么 = 和 - = 就可以呢?那是因為 = 和 - = 重寫變成了 add 和 remove 的方法,是 public 的,所以可以在外部調用,想了解底層的同學也可以查找相關資料。
總之一句話,事件就是特殊的委托,直觀的區別就是在外部類中無法直接使用 = 賦值,在我看來好處就是防止外部直接賦值導致所有的注冊丟失,有一定的安全性。
第三步
我們現在知道了什么是委托,什么是事件,終于要搞明白什么是 Action、Func 啦!
慣例,先來看看 C# 中是怎么使用 Action、Func 的吧!上代碼:
用法我簡單的寫了一下,其實 Action 就是一個 System 庫自帶的已經幫你聲明好的委托,因為我使用 Action 的時候并沒有聲明 delegate 這一步的操作,而是直接使用 public Action test Action1 來聲明使用,看到這里迷惑的你是不是已經大概清楚了呢?為了讓你看的更明白,我直接把 Action 到底是個啥寫幾個事例出來:
public delegate void Action();
public delegate void Action<in T1 >(T1 arg1);
public delegate void Action<in T1 ,in T2>(T1 arg1,T2 arg2);
public delegate void Action<in T1 ,in T2,in T3>(T1 arg1,T2 arg2,T3 arg3);
……..
一直寫到 16 個參數。
其實這些代碼就是 Action 的聲明,只是寫在了系統自帶的庫里,所以我們才能直接拿來用,其實就是系統幫我們做了第一步,我們可以直接用,很方便。
Func 同理,只是把 void 換成了帶有返回值的而已。
而且系統還貼心的幫我們加了泛型參數,這樣使用起來就更方便了,可以使用任何我們自定義的參數,只要參數數量匹配即可。
轉載聲明:本文來源于網絡,不作任何商業用途

全部評論


暫無留言,趕緊搶占沙發
熱門資訊

專訪|王氏教育集團康海威老師:國民手游《王者榮耀》曹操高低模打造者...

繪學霸規則玩法大全

第十七屆王座杯大賽人氣獎投票正式開始,誰獲獎?你說了算!...

網飛再出沙雕番!沙雕又賢惠的黑道大哥竟是我老公之《主夫的誘惑》?...

全國春茶地圖出爐 春茶有哪些?

王氏教育集團榮獲騰訊教育回響中國“2022年度口碑影響力職業教育品牌”!...

完美世界游戲全新品牌升級

游戲美術設計師的重要性

游戲《雙人成行》總監:我下一款作品更牛逼...
