發(fā)布于:2021-01-27 10:23:42
0
524
0
在C#,Action和Func是非常有用的工具,可以減少代碼中的重復和耦合。
遺憾的是,許多開發(fā)人員對它們避而遠之,因為他們并不真正理解它們。
向工具箱中添加Action和Func是改進C代碼的一個非常重要的步驟。
了解它們的用途和使用方法其實并不難,只是需要一點耐心。
思考Action <>的簡單方法
我們中的大多數(shù)人都非常熟悉如何找到重復代碼的部分,將代碼提取到方法中,并使該方法采用參數(shù)來表示差異。
下面是一個很熟悉的小例子:
這些方法中的每一種幾乎都執(zhí)行相同的操作。這里唯一的區(qū)別是蔬菜的類型和蒸熟的時間。
將代碼重構為:
更好的是,現(xiàn)在我們不再用3種不同的方法重復“操作”。
現(xiàn)在讓我們想象一下,我們想要做的不僅僅是蒸汽。我們需要能夠煎或烤蔬菜。我們怎么做呢?
可能我們需要添加一些新的方法來實現(xiàn)這一點。因此我們最終會得到如下結(jié)果:
嗯,又重復了很多次。沒問題。我們就照第一套方法做一個蔬菜烹飪法吧。既然我們總是清潔,然后烹飪,然后上菜,我們就可以把我們要用的烹飪方法傳過來了。
等等,我們怎么做?我們不能只提取烘焙、油炸或蒸汽,因為烘焙、油炸和蒸汽方法是邏輯而不是數(shù)據(jù)。
除非…除非我們能給他們提供數(shù)據(jù)。我們能做到嗎?
我們當然可以,看看這個:
我們和第一次重構時一樣,去掉了重復的代碼,只是這次我們參數(shù)化了方法調(diào)用,而不是數(shù)據(jù)。
如果您理解了這一點,那么您就理解了操作。操作只是一種將方法視為數(shù)據(jù)的方式。現(xiàn)在您可以將所有公共邏輯提取到一個方法中,并傳入發(fā)生變化的數(shù)據(jù)和發(fā)生變化的操作。
恭喜你,你不用創(chuàng)建一個抽象基類和一個巨大的繼承樹就可以完成策略模式了!
所以當你看到Action時,只要想“啊,那意味著我正在傳遞一個方法作為數(shù)據(jù)。”
其實就這么簡單
那么Func <>呢?
如果您了解Action,就可以了解Func。
轉(zhuǎn)換為英語的Func <X,Y,Z>是:“一種將X和Y作為參數(shù)并返回Z的方法?!?/span>
Action和Func之間的唯一區(qū)別是Func的最后一個模板參數(shù)是返回類型。Func具有非void返回值。
謂詞是一個Func,總是返回一個布爾值。
這就是它的全部內(nèi)容了,真的不需要知道更多的東西來確定Action和Func,以便開始使用它們。