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

全部評論


暫無留言,趕緊搶占沙發(fā)
熱門資訊

什么!參加王座杯能瓜分25000元?先讓旺旺噠我康康!...

CGWANG王氏教育怎么樣?

數(shù)字媒體藝術(shù)專業(yè)要學什么軟件?

游戲原畫人體線稿怎么畫?快來get!

一組風格獨特的插畫,來自巴西藝術(shù)家Raysa Fontana!...

如何理清 C# 委托、事件、Action、Func?

C4D超強渲染器:OC渲染器!

畢業(yè)學員采訪丨王氏教育學生,牛的!

轉(zhuǎn)行做什么工作比較好?
