如何理清 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 換成了帶有返回值的而已。
而且系統還貼心的幫我們加了泛型參數,這樣使用起來就更方便了,可以使用任何我們自定義的參數,只要參數數量匹配即可。
轉載聲明:本文來源于網絡,不作任何商業用途

全部評論


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

繪學霸訂單服務協議V1.1.0

參與王座杯后,同學們直呼太幸福!免費吃肯德基方法get!...

原畫繪畫風格,你知道幾種?

《口袋奇兵》海外月流水居然超2億?

米哈游:新作《崩壞:星穹鐵道》,預計登錄移動和PC市場...

綜藝節目《向往的生活》花子設計的秘密

王氏教育王康慧受邀于《教育正能量》欄目解答什么是社會需要的人才?...

盤點UE4.27 的主要新功能,你都知道嗎?

王座杯比賽答疑,快來GET正確交稿姿勢!
