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