日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
另類的思維將事件視為對(duì)象

將事件視為對(duì)象,有的時(shí)候就是把事件的級(jí)別進(jìn)行了提升,這樣就能有效地提高語(yǔ)言的抽象能力。有的時(shí)候會(huì)出現(xiàn)錯(cuò)誤,但還是值得嘗試的。

創(chuàng)新互聯(lián)公司自2013年起,先為井陘礦等服務(wù)建站,井陘礦等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為井陘礦企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

如果一個(gè)語(yǔ)言(平臺(tái))把事件視為對(duì)象,則表明它把“事件”作為了語(yǔ)言的一等公民來(lái)對(duì)待。這意味著,我們可以把一個(gè)單獨(dú)的事件作為參數(shù)傳遞給方法,也可以將其作為一個(gè)對(duì)象的一部分,這有效地提高語(yǔ)言的抽象能力。試想,如果沒(méi)有“委托”,在.NET中就無(wú)法把“方法”看作是對(duì)象,也就很難使用如今各種靈活的抽象方式。同樣,由于.NET本身無(wú)法將事件作為單個(gè)對(duì)象處理,因此在某些時(shí)候就會(huì)束手束腳,也難以引入一些特別的編程模型。

這就是“把事件作為對(duì)象進(jìn)行傳遞”的實(shí)際意義。

在上一篇文章里,我們提出了一種“解決方案”,它允許我們編寫(xiě)這樣的代碼:

 
 
 
  1. class Program  
  2. {  
  3. public event EventHandler Submit;  
  4.    
  5. static void Main(string[] args)  
  6. {  
  7. Program p = new Program();  
  8. var ev = EventFactory.Create(() => p.Submit);  
  9. ev += (sender, eventArgs) => Console.WriteLine(sender);  
  10.    
  11. p.Submit("Hello World", EventArgs.Empty);  
  12.    
  13. Console.WriteLine("Press any key to exit...");  
  14. Console.ReadLine();  
  15. }  

看上去挺那么像回事兒的,使用方式和傳統(tǒng)的事件似乎沒(méi)有太大區(qū)別。但是文末我提到這里其實(shí)有些“糊弄”的意味,而我們的裝配腦袋同學(xué)、以及“腦袋裝配得不輸給裝配腦袋”的RednaxelaFX,這兩位純爺們也都指出了問(wèn)題。

信腦袋,得永生。信RednaxelaFX,原地滿狀態(tài)復(fù)活。

以上代碼的“忽悠”,在于操作Program.Submit的代碼處于Program類之內(nèi)。如果我們想要使用相同的做法操作其他類的事件就做不到了,例如:

 
 
 
  1. public class MyClass  
  2. {  
  3. public event EventHandler MyEvent;  
  4. }  
  5.  
  6. class Program  
  7. {  
  8. static void Main(string[] args)  
  9. {  
  10. var myClass = new MyClass();  
  11. var ev = EventFactory.Create(() => myClass.MyEvent);  
  12. }  

這樣的代碼看似沒(méi)有問(wèn)題,但是編譯器會(huì)提示這樣的錯(cuò)誤:

The event 'SimpleConsole.MyClass.MyEvent' can only appear on the left hand side of += or -= (except when used from within the type 'SimpleConsole.MyClass')

編譯器告訴我們,除了在MyClass類的內(nèi)部,MyEvent事件只能出現(xiàn)在+=或-=操作的左邊。之前提到的兩位純爺們?cè)谇拔牡脑u(píng)論中也有過(guò)相關(guān)及衍生的討論。因此,我們目前的做法是失敗的。

前文的評(píng)論中還有朋友提到,我們事實(shí)上也可以把一個(gè)事件作為參數(shù)傳遞給一個(gè)方法(然后在方法里添加或刪除處理程序),只要使用ref關(guān)鍵字就可以了,例如:

 
 
 
  1. static void RegisterHandlers(ref EventHandler e) { ... } 

然后:

 
 
 
  1. static void Main(string[] args)  
  2. {  
  3. var myClass = new MyClass();  
  4. RegisterHandlers(ref myClass.MyEvent);  

不過(guò)很顯然,這樣的做法也會(huì)遇到相同的問(wèn)題:除非是Program內(nèi)部的事件,我們不能把它像一個(gè)委托對(duì)象那樣傳遞。而且,即使可以傳遞,我們也只能為它添加或刪除處理函數(shù),而不能把它作為另一個(gè)對(duì)象的一部分,然后經(jīng)過(guò)各種處理之后,還可以對(duì)這個(gè)事件進(jìn)行操作。

因此,我們要實(shí)現(xiàn)的其實(shí)是這樣一個(gè)類型:

 
 
 
  1. public class DelegateEvent  
  2. {  
  3. ...  
  4.  
  5. public DelegateEvent AddHandler(TDelegate handler) { ... }  
  6.  
  7. public DelegateEvent RemoveHandler(TDelegate handler) { ... }  
  8. }  

這就是今天“趣味編程”的題目:將DelegateEvent<>類型實(shí)現(xiàn)完整,并盡可能做到嚴(yán)謹(jǐn)和易用(即適用于各種場(chǎng)合,各種方式進(jìn)行“構(gòu)造”)。

所謂“趣味編程”,是指那些我覺(jué)得難度適中的小題目,并可以鍛煉“編程能力”或“語(yǔ)言類庫(kù)的掌握程度”。一般來(lái)說(shuō)它們都源自實(shí)際項(xiàng)目,只不過(guò)改造成“題目”時(shí)進(jìn)行了“抽象”和“提煉”。個(gè)人認(rèn)為它們還是挺適合作為平時(shí)的編程練習(xí)來(lái)使用的,感興趣的朋友們不妨一試。

至于題目是否真的有“趣味”……這個(gè)見(jiàn)仁見(jiàn)智吧。我想,要讓那些對(duì)于那些視編程如磨難的朋友們感到有趣,應(yīng)該不比登天要容易一些。


網(wǎng)頁(yè)標(biāo)題:另類的思維將事件視為對(duì)象
轉(zhuǎn)載注明:http://www.5511xx.com/article/cdjodce.html