C#委托之就是跟委托过不去…
在上一篇博文當(dāng)中,我們例舉了一個機(jī)房自動化系統(tǒng)的邏輯控制程序,其中用到了Lambda表達(dá)式,因此方便了我們程序功能的實現(xiàn).然而,我們不能僅僅為實現(xiàn)功能,完成任務(wù)而奮斗,應(yīng)該知其然,知其所以然,也就是說,知道了Lambda表達(dá)式能夠帶來這樣的方便,也應(yīng)該知道為什么能夠帶來這樣的方便,接下來,就跟大家一起來一次小小的探索之旅吧.
?
為了弄清為什么,我們用Reflector反編譯一下源程序,
?
static void Main(string[] args){Monitor.OpenEventHandler OnOpen;//定義一個委托變量OpenSomething openSomething = new OpenSomething();//實例化用于開啟的對象OnOpen = openSomething.OpenPower;OnOpen += openSomething.OpenServer;OnOpen += () => openSomething.OpenServices(5);//依然是把方法的引用賦值給委托變量OnOpen();Console.ReadKey();}}
?
用Reflector反編譯一下,查看Program類的Main方法,如下圖
?
先是實例化一個OpenSomething對象,然后實例化OpenEventHandler類型的委托變量,并將OpenPower方法的引用賦給它,這在源程序中是分兩行來完成的,這里因為是反編譯,其實道理都一樣.
接下來的一行代碼,揭示了給委托賦值的原理,也就是我們用的”+=”符號,在反編譯之后,可以看到,它其實是調(diào)用了Delegate類的Combine方法,該方法的作用是把兩個委托連接起來,它有兩個參數(shù),參數(shù)類型都是委托,第一個是OnOpen,也就是原委托,第二個就是需要連接的另一個委托,new Monitor.OpenEventHandler(openSomething.OpenPower)其實是實例化了一個新的委托變量,并以此來和OnOpen連接。因此,我們得知,在日常使用”+=”時,表面上看起來是將方法名”拼接”到一個委托變量的后面,調(diào)用委托時,會依次調(diào)用這些方法,而實際上是將兩個類型相同的委托變量Combine到一起,原來如此啊……
?
再接再勵,下面的一行代碼對應(yīng)源程序中的Lambda表達(dá)式了,它與上一行不同的是,第二個參數(shù)用到了delegate{…}語法,這是匿名委托,由此可見,在用Lambda表達(dá)式時,內(nèi)部實現(xiàn)原理其實就是新定義了一個可以傳參的匿名委托,這樣,我們就明白了,連接類型相同的委托變量時,程序會實例化一個新委托變量,而連接不同類型的委托變量,程序會定義并實例化一個匿名委托,用于連接,而對于委托變量之間的連接,并不要求它們擁有相同的委托類型。
Lambda表達(dá)式在一定程度上對以前的技術(shù)進(jìn)行了封裝,而至于為什么要封裝,以及除封裝以外還有的許多其他特性,是值得我們?nèi)パ芯康?。我們在學(xué)習(xí)對自己來說是新的技術(shù)的時候,要養(yǎng)成知其所以然的習(xí)慣,知道Lambda表達(dá)式可以這樣用,再經(jīng)過類似本文這樣的探究之后,對它的印象是不是會更深刻呢。了解了它,再用它,才會得心應(yīng)手,可控性才會強(qiáng),出問題了,也更容易發(fā)現(xiàn)。這就好比在公司,老板要對他的員工委以重任,必須先要了解這個員工的性格,考慮他是否合適做,而不僅僅是看他能力,一樣的。
轉(zhuǎn)載于:https://www.cnblogs.com/Alex-bg/archive/2012/05/17/2506927.html
總結(jié)
以上是生活随笔為你收集整理的C#委托之就是跟委托过不去…的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS拖拽,移动与拉伸
- 下一篇: C# :试玩EventLog