把函數(shù)看成Object后,自然可以把函數(shù)作為成員、變量來(lái)用,甚至可以作為另一個(gè)函數(shù)的參數(shù)值、返回值!
在C/C++中,用函數(shù)指針來(lái)實(shí)現(xiàn)這個(gè)功能。在C#中,為了類型安全,回避了指針。幸運(yùn)的是,在C#中,有在語(yǔ)義上等價(jià)于函數(shù)指針的delegate類型。
一個(gè)delegate實(shí)例可以引用一個(gè)函數(shù)。一旦把一個(gè)函數(shù)賦值給一個(gè)delegate,該delegate看起來(lái)就像是那個(gè)函數(shù)的替身。
由此可見(jiàn),不同語(yǔ)言僅僅用不同的語(yǔ)法闡述了相同的思想!
《重構(gòu)》一書(shū)中,有"封裝字段"這個(gè)重構(gòu),這是一個(gè)非常簡(jiǎn)單、非常樸素、一點(diǎn)都不花哨的重構(gòu)。但是,背后的思想非常深厚、深遠(yuǎn)、深邃。
在C#中有Property來(lái)實(shí)現(xiàn)這個(gè)重構(gòu)。沒(méi)有它的話,我們可能要多寫(xiě)幾行GetXXX()、SetXXX()了。
如果,那個(gè)Field不是普通的字段,恰恰是個(gè)函數(shù)字段(即delegate實(shí)例)咋辦?難道函數(shù)字段就能暴露了嗎?!
既然,你已經(jīng)接受了它,就要好好對(duì)待它,千萬(wàn)別虐待它!
同樣,在C#中有event來(lái)實(shí)現(xiàn)。沒(méi)有它的話,我們就又要多寫(xiě)幾行AddXXX()、RemoveXXX()了!
當(dāng)你寫(xiě)下:
public event EventHandler MyEvent;
就相當(dāng)于,寫(xiě)了:
private EventHandler _myEvent;
public event EventHandler MyEvent{ add { lock (this) { _myEvent += value;
} } remove { lock (this) { _myEvent -= value;
} }}
是不是,與Property有異曲同工之效?!
相信,大家對(duì)event存在性的疑慮已經(jīng)消除!
另外,很多人疑惑"為啥只有+=、-=,而沒(méi)有="。
程序員很像木匠、瓦匠、漆匠、鐵匠……,都是靠手藝吃飯的。在長(zhǎng)期的勞動(dòng)中,有些善于思考師傅就總結(jié)出一些經(jīng)驗(yàn)。《重構(gòu)》一書(shū),就是馬師傅總結(jié)出來(lái)的。他認(rèn)為,要"封裝集合",因?yàn)橛泻锰帲?br />假設(shè),event支持=,如果一個(gè)年少無(wú)知的client,到你那里=了一下,你好不容易掛到的2個(gè)太陽(yáng)3個(gè)月亮1個(gè)星星就沒(méi)了。