亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#事件(event)使用方法詳解

2019-10-29 21:06:23
字體:
來源:轉載
供稿:網友

事件(event),這個詞兒對于初學者來說,往往總是顯得有些神秘,不易弄懂。而這些東西卻往往又是編程中常用且非常重要的東西。大家都知道windows消息處理機制的重要,其實C#事件就是基于windows消息處理機制的,只是封裝的更好,讓開發者無須知道底層的消息處理機制,就可以開發出強大的基于事件的應用程序來。

先來看看事件編程有哪些好處。

在以往我們編寫這類程序中,往往采用等待機制,為了等待某件事情的發生,需要不斷地檢測某些判斷變量,而引入事件編程后,大大簡化了這種過程:

- 使用事件,可以很方便地確定程序執行順序。

- 當事件驅動程序等待事件時,它不占用很多資源。事件驅動程序與過程式程序最大的不同就在于,程序不再不停地檢查輸入設備,而是呆著不動,等待消息的到來,每個輸入的消息會被排進隊列,等待程序處理它。如果沒有消息在等待,則程序會把控制交回給操作系統,以運行其他程序。

- 事件簡化了編程。操作系統只是簡單地將消息傳送給對象,由對象的事件驅動程序確定事件的處理方法。操作系統不必知道程序的內部工作機制,只是需要知道如何與對象進行對話,也就是如何傳遞消息。

有了這么多好處,看來我們的確有必要掌握它。俗話說:“難了不會,會了不難”。就讓我們一步一步開始吧...

要講事件,必然要講到委托(delegate)。它們之間的關系可以通過一個淺顯的比方來說明,這個比方可能不是十分恰當。比如你要租一個房屋,這是一個事件,那么委托就是房屋租賃中介,當你把租房子的消息告知中介后,中介就會產生出一套符合你要求的房屋租賃方案來。再由中介執行這套方案,你便租得了這個房屋,即事件被處理了。當然你也可以不通過中介,直接找房東,但如果沒有互聯網等工具,你如何得到誰出租房屋的信息?話題扯遠了。

委托(delegate)

委托可以理解成為函數指針,不同的是委托是面向對象,而且是類型安全的。關于委托的理解,可以參考我的另一篇文章《C#委托之個人理解》。

事件(event)

我們可以把事件編程簡單地分成兩個部分:事件發生的類(書面上叫事件發生器)和事件接收處理的類。事件發生的類就是說在這個類中觸發了一個事件,但這個類并不知道哪個個對象或方法將會加收到并處理它觸發的事件。所需要的是在發送方和接收方之間存在一個媒介。這個媒介在.NET Framework中就是委托(delegate)。在事件接收處理的類中,我們需要有一個處理事件的方法。好了,我們就按照這個順序來實現一個捕獲鍵盤按鍵的程序,來一步一步說明如何編寫事件應用程序。

1、首先創建一個自己的EventArgs類。

引自MSDN:

EventArgs是包含事件數據的類的基類,此類不包含事件數據,在事件引發時不向事件處理程序傳遞狀態信息的事件會使用此類。如果事件處理程序需要狀態信息,則應用程序必須從此類派生一個類來保存數據。

因為在我們鍵盤按鍵事件中要包含按鍵信息,所以要派生一個KeyEventArgs類,來保存按鍵信息,好讓后面知道按了哪個鍵。

internal class KeyEventArgs : EventArgs {	private char keychar;	public KeyEventArgs( char keychar ) : base() 	{		this.keychar = keychar;		public char Keychar		{		get		{		return keychar;	}}}

2、再創建一個事件發生的類KeyInputMonitor,這個類用于監控鍵盤按鍵的輸入并觸發一個事件:

 

internal class KeyInputMonitor {  // 創建一個委托,返回類型為void,兩個參數  public delegate void KeyDownHandler( object sender, KeyEventArgs e );  // 將創建的委托和特定事件關聯,在這里特定的事件為KeyDown  public void Run()   {    bool finished = false;    do     {      Console.WriteLine( "Input a char" );      string response = Console.ReadLine();      char responsechar = ( response == "" ) ? ' ' : char.ToUpper( response[0] );      switch( responsechar )       {        case 'X':        finished = true;        break;        default:        // 得到按鍵信息的參數        KeyEventArgs keyEventArgs = new KeyEventArgs( responsechar );        // 觸發事件        KeyDown( this, keyEventArgs );        break;      }    }    while( !finished );  }}

這里注意KeyDown( this, KeyEventArgs );一句,這就是觸發事件的語句,并將事件交由KeyDownHandler這個委托來處理,委托指定事件處理方法去處理事件,這就是事件接收方的類的事情了。參數this是指觸發事件的對象就是本身這個對象,keyEventArgs包含了按鍵信息。

3、最后創建一個事件接收方的類,這個類先產生一個委托實例,再把這個委托實例添加到產生事件對象的事件列表中去,這個過程又叫訂閱事件。然后提供一個方法回顯按鍵信息。

internal class EventReceiver {  public EventReceiver( KeyInputMonitor monitor )   {    // 產生一個委托實例并添加到KeyInputMonitor產生的事件列表中    monitor.KeyDown += new KeyInputMonitor.KeyDownHandler( this.OnKeyDown );  }  private void OnKeyDown(object sender, KeyEventArgs e)   {    // 真正的事件處理函數    Console.WriteLine( "Capture key: {0}", e.Keychar );  }}

4、看一下如何調用

public class MainEntryPoint{public static void Start() {  // 實例化一個事件發送器  KeyInputMonitor monitor = new KeyInputMonitor();  // 實例化一個事件接收器  EventReceiver eventReceiver = new EventReceiver( monitor );  // 運行  monitor.Run();}}

總結:

C#中使用事件需要的步驟:

1.創建一個委托

2.將創建的委托與特定事件關聯(.Net類庫中的很多事件都是已經定制好的,所以他們也就有相應的一個委托,在編寫關聯事件處理程序--也就是當有事件發生時我們要執行的方法的時候我們需要和這個委托有相同的簽名)

3.編寫事件處理程序

4.利用編寫的事件處理程序生成一個委托實例

5.把這個委托實例添加到產生事件對象的事件列表中去,這個過程又叫訂閱事件

C#中事件產生和實現的流程:

1.定義A為產生事件的實例,a為A產生的一個事件

2.定義B為接收事件的實例,b為處理事件的方法

3.A由于用戶(程序編寫者或程序使用者)或者系統產生一個a事件(例如點擊一個Button,產生一個Click事件)

4.A通過事件列表中的委托對象將這個事件通知給B

5.B接到一個事件通知(實際是B.b利用委托來實現事件的接收)

6.調用B.b方法完成事件處理

public class A {  public delegate void EventHandler(object sender);  public void Run()   {    Console.WriteLine("Trigger an event.");    a(this);  }}class B {  public B(A a)   {    a.a += new A.EventHandler(this.b);  }  private void b(object sender)   {    Console.WriteLine("Received and handled an event." );    Console.Read();  }}


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品手机在线| 久久99亚洲热视| 高跟丝袜一区二区三区| 久久精品中文字幕| 精品成人av一区| 久久综合网hezyo| 欧美日韩国产123| 永久免费看mv网站入口亚洲| 亚洲高清一二三区| 91精品国产免费久久久久久| 亚洲最大av在线| 国产精品自拍小视频| 国产精品永久免费视频| 正在播放欧美视频| 亚洲欧美日韩精品| 国产精品高清免费在线观看| 中文在线资源观看视频网站免费不卡| 亚洲国产一区自拍| 97在线视频免费| 国产精品美女午夜av| 九九久久久久久久久激情| 精品成人国产在线观看男人呻吟| 中文字幕综合一区| 欧美久久精品一级黑人c片| 日韩欧美国产网站| 美女视频久久黄| 欧美日韩免费网站| 国产精品视频成人| 久久精品影视伊人网| 国产亚洲一区二区精品| 欧美成年人视频网站| 欧美亚洲另类视频| 日韩av综合网站| 亚洲精品久久久久国产| 国产精品久久久久免费a∨大胸| 国产日产欧美精品| 国产精品va在线播放我和闺蜜| 国产精品露脸av在线| 国产国产精品人在线视| 亚洲欧美成人一区二区在线电影| 国产精品视频在线播放| 色婷婷综合成人| 国产精品久久久久久久久久久久久| 姬川优奈aav一区二区| 在线观看欧美视频| 日韩欧美国产高清91| 奇米一区二区三区四区久久| 国产精品视频免费在线| 国产一区二区在线免费视频| 尤物tv国产一区| 国产精品久久久久不卡| 91精品久久久久久久久不口人| 欧美一级大片在线免费观看| 午夜精品久久久久久久久久久久| 亚洲影视中文字幕| 国内精品久久久久久影视8| 午夜精品久久久久久久男人的天堂| 欧美丝袜一区二区| 美女啪啪无遮挡免费久久网站| 欧美日韩中文字幕日韩欧美| 国产精品高清在线| 国内精品美女av在线播放| 91九色视频在线| 国产激情综合五月久久| 欧美成人激情视频| 8050国产精品久久久久久| 黑人与娇小精品av专区| 日韩精品在线播放| 国产精品视频一区国模私拍| 日韩免费看的电影电视剧大全| 久久久久国产精品免费| 日韩免费观看高清| 精品久久香蕉国产线看观看gif| 久久99久久久久久久噜噜| 日韩中文理论片| 欧美插天视频在线播放| 国产成人极品视频| 国产一区二区三区三区在线观看| 亚洲网站在线看| 亚洲一区二区日本| 欧美性xxxxxxx| 国产精品网红直播| 国产精品吊钟奶在线| 国产成人精品日本亚洲专区61| 国产视频在线观看一区二区| 国产一区二区黄| 97视频免费看| 国产日韩在线观看av| 成人性生交大片免费看视频直播| 亚洲黄色www网站| 色综合男人天堂| 精品福利视频导航| 欧美日韩国产精品专区| 中文字幕亚洲精品| 久久精品视频中文字幕| 国产精品自产拍在线观看| 精品性高朝久久久久久久| 精品久久久久久中文字幕一区奶水| 色偷偷噜噜噜亚洲男人的天堂| 欧美日本啪啪无遮挡网站| 国内精品久久久久影院 日本资源| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产97免费视| 国产精品免费小视频| 中文字幕欧美视频在线| 亚洲国产欧美日韩精品| 欧美激情按摩在线| 亚洲肉体裸体xxxx137| 国内精品视频一区| 欧美黑人国产人伦爽爽爽| 亚洲欧洲高清在线| 久久精品国产成人精品| 狠狠综合久久av一区二区小说| 日韩一区二区精品视频| 7777精品久久久久久| 中文字幕日韩欧美精品在线观看| 久久久国产精品免费| 国产精品久久久久久久久久| 欧美精品国产精品日韩精品| 中文字幕精品一区久久久久| 亚洲一区二区三区香蕉| 人妖精品videosex性欧美| 亚洲欧洲一区二区三区久久| 成人黄色影片在线| 国产精品一区二区电影| 中文字幕国内精品| 亚洲国产天堂久久综合网| 26uuu国产精品视频| 九九视频这里只有精品| 欧美高清视频在线| 久久久久这里只有精品| 日韩在线视频二区| 日韩精品在线视频观看| 色777狠狠综合秋免鲁丝| 久久久久久国产精品久久| 国产精品亚洲激情| 精品视频久久久久久| 欧美一区二区影院| 国产一区二区三区视频免费| 欧美一区亚洲一区| 久久久久久国产精品| 欧美丝袜一区二区三区| 国产女同一区二区| 136fldh精品导航福利| 亚洲精品白浆高清久久久久久| 亚洲va电影大全| 国产91在线高潮白浆在线观看| 国产精品一区二区三区免费视频| 精品亚洲国产成av人片传媒| 亚洲精品www| 日本sm极度另类视频| 日韩中文在线观看| 国产精品电影网站| 日韩小视频在线观看| 欧美成人午夜免费视在线看片| 日韩精品小视频| 色噜噜狠狠狠综合曰曰曰| 午夜精品久久久久久99热软件| 欧美性高潮床叫视频| 国产在线久久久| 欧美日韩亚洲系列| 91精品啪aⅴ在线观看国产| 国产午夜精品理论片a级探花| 久久亚洲综合国产精品99麻豆精品福利|