成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

另類的思維 將事件視為對象

開發 后端
我們這里將討論一下這個另類的思維,那就是如果一個語言(平臺)把事件視為對象,則表明它把“事件”作為了語言的一等公民來對待。這會不會產生錯誤?

將事件視為對象,有的時候就是把事件的級別進行了提升,這樣就能有效地提高語言的抽象能力。有的時候會出現錯誤,但還是值得嘗試的。

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

這就是“把事件作為對象進行傳遞”的實際意義。

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

  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. }  

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

信腦袋,得永生。信RednaxelaFX,原地滿狀態復活。

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

  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. }  

這樣的代碼看似沒有問題,但是編譯器會提示這樣的錯誤:

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類的內部,MyEvent事件只能出現在+=或-=操作的左邊。之前提到的兩位純爺們在前文的評論中也有過相關及衍生的討論。因此,我們目前的做法是失敗的。

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

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

然后:

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

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

因此,我們要實現的其實是這樣一個類型:

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

這就是今天“趣味編程”的題目:將DelegateEvent<>類型實現完整,并盡可能做到嚴謹和易用(即適用于各種場合,各種方式進行“構造”)。

所謂“趣味編程”,是指那些我覺得難度適中的小題目,并可以鍛煉“編程能力”或“語言類庫的掌握程度”。一般來說它們都源自實際項目,只不過改造成“題目”時進行了“抽象”和“提煉”。個人認為它們還是挺適合作為平時的編程練習來使用的,感興趣的朋友們不妨一試。

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

原文標題:趣味編程:將事件視為對象

鏈接:http://www.cnblogs.com/JeffreyZhao/archive/2009/09/09/more-on-event-as-object.html

【編輯推薦】

  1. C#線程同步詳細分析
  2. C#探討木馬程序淺談
  3. C# Pop3Connection類簡介
  4. C#數據類型簡單介紹
  5. C#計算素數序列淺談

 

責任編輯:彭凡 來源: 博客園
相關推薦

2010-06-01 09:20:45

jQuery

2016-12-21 09:57:03

大數據

2022-03-31 10:27:34

區塊鏈黃金技術

2010-11-19 15:39:58

2013-09-13 15:19:08

英特爾移動平臺IDF

2022-02-21 11:07:19

AI/ML人工智能

2009-10-29 13:20:53

光纖接入網

2021-01-18 15:28:13

加密貨幣比特幣貨幣

2024-06-26 19:14:53

2015-03-13 09:30:23

iOS內存管理

2023-05-23 10:30:56

CEOAI

2016-11-04 13:52:05

物聯網物聯網戰略

2013-07-10 09:38:22

OpenStackLinux

2011-07-21 17:19:47

java面向對象

2010-11-23 11:16:35

MySQL表別名

2009-10-23 17:10:27

試用達人

2020-03-10 18:53:16

移動支付另類支付APP

2011-04-25 13:13:02

Javafinalize

2015-09-25 10:58:20

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.国产 | 日韩伦理电影免费在线观看 | 欧美日韩精品免费 | 成人欧美一区二区三区在线观看 | 国产精品18久久久久久白浆动漫 | 日日想夜夜操 | 欧美精品久久 | 日韩av高清 | 国产精品a久久久久 | 亚洲激情视频在线 | 在线观看中文字幕视频 | 国产日韩欧美精品一区二区三区 | 色www精品视频在线观看 | 在线视频国产一区 | 91精品国产乱码久久久久久 | 日韩午夜精品 | 九色 在线| 久久久久国产精品 | 国产最好的av国产大片 | 中文精品久久 | 91观看| 亚洲精品免费视频 | 九九热精品视频 | 日韩欧美一区二区在线播放 | 久久手机在线视频 | 久久国产综合 | 黄一级| 香蕉视频91 | 国产欧美日韩在线 | 黄色成人免费看 | 国产精品自拍视频网站 | 亚洲国产精品一区二区三区 | 日韩精品一区二区三区视频播放 | 91精品国产综合久久久久久首页 | 日韩在线视频观看 | 成年免费视频 | 欧美日本在线 | 欧美日韩免费视频 | 国产精品美女在线观看 | 亚洲国产精品一区二区久久 | 国产高清在线精品 |