日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#委托之就是跟委托过不去…

發(fā)布時間:2023/12/13 C# 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#委托之就是跟委托过不去… 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在上一篇博文當(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。