亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2018年01月17日 08:45:13   投稿:hebedich  
本文給大家介紹了在C#中,事件(event)的概念和使用方法,文章適合一些初學(xué)者學(xué)習(xí),主要講解了一些概念和一些代碼案例。

事件(event),這個(gè)詞兒對(duì)于初學(xué)者來(lái)說(shuō),往往總是顯得有些神秘,不易弄懂。而這些東西卻往往又是編程中常用且非常重要的東西。大家都知道windows消息處理機(jī)制的重要,其實(shí)C#事件就是基于windows消息處理機(jī)制的,只是封裝的更好,讓開(kāi)發(fā)者無(wú)須知道底層的消息處理機(jī)制,就可以開(kāi)發(fā)出強(qiáng)大的基于事件的應(yīng)用程序來(lái)。

先來(lái)看看事件編程有哪些好處。

在以往我們編寫(xiě)這類(lèi)程序中,往往采用等待機(jī)制,為了等待某件事情的發(fā)生,需要不斷地檢測(cè)某些判斷變量,而引入事件編程后,大大簡(jiǎn)化了這種過(guò)程:

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

- 當(dāng)事件驅(qū)動(dòng)程序等待事件時(shí),它不占用很多資源。事件驅(qū)動(dòng)程序與過(guò)程式程序最大的不同就在于,程序不再不停地檢查輸入設(shè)備,而是呆著不動(dòng),等待消息的到來(lái),每個(gè)輸入的消息會(huì)被排進(jìn)隊(duì)列,等待程序處理它。如果沒(méi)有消息在等待,則程序會(huì)把控制交回給操作系統(tǒng),以運(yùn)行其他程序。

- 事件簡(jiǎn)化了編程。操作系統(tǒng)只是簡(jiǎn)單地將消息傳送給對(duì)象,由對(duì)象的事件驅(qū)動(dòng)程序確定事件的處理方法。操作系統(tǒng)不必知道程序的內(nèi)部工作機(jī)制,只是需要知道如何與對(duì)象進(jìn)行對(duì)話,也就是如何傳遞消息。

有了這么多好處,看來(lái)我們的確有必要掌握它。俗話說(shuō):“難了不會(huì),會(huì)了不難”。就讓我們一步一步開(kāi)始吧...

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

委托(delegate)

委托可以理解成為函數(shù)指針,不同的是委托是面向?qū)ο螅沂穷?lèi)型安全的。關(guān)于委托的理解,可以參考我的另一篇文章《C#委托之個(gè)人理解》。

事件(event)

我們可以把事件編程簡(jiǎn)單地分成兩個(gè)部分:事件發(fā)生的類(lèi)(書(shū)面上叫事件發(fā)生器)和事件接收處理的類(lèi)。事件發(fā)生的類(lèi)就是說(shuō)在這個(gè)類(lèi)中觸發(fā)了一個(gè)事件,但這個(gè)類(lèi)并不知道哪個(gè)個(gè)對(duì)象或方法將會(huì)加收到并處理它觸發(fā)的事件。所需要的是在發(fā)送方和接收方之間存在一個(gè)媒介。這個(gè)媒介在.NET Framework中就是委托(delegate)。在事件接收處理的類(lèi)中,我們需要有一個(gè)處理事件的方法。好了,我們就按照這個(gè)順序來(lái)實(shí)現(xiàn)一個(gè)捕獲鍵盤(pán)按鍵的程序,來(lái)一步一步說(shuō)明如何編寫(xiě)事件應(yīng)用程序。

1、首先創(chuàng)建一個(gè)自己的EventArgs類(lèi)。

引自MSDN:

EventArgs是包含事件數(shù)據(jù)的類(lèi)的基類(lèi),此類(lèi)不包含事件數(shù)據(jù),在事件引發(fā)時(shí)不向事件處理程序傳遞狀態(tài)信息的事件會(huì)使用此類(lèi)。如果事件處理程序需要狀態(tài)信息,則應(yīng)用程序必須從此類(lèi)派生一個(gè)類(lèi)來(lái)保存數(shù)據(jù)。

因?yàn)樵谖覀冩I盤(pán)按鍵事件中要包含按鍵信息,所以要派生一個(gè)KeyEventArgs類(lèi),來(lái)保存按鍵信息,好讓后面知道按了哪個(gè)鍵。

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

2、再創(chuàng)建一個(gè)事件發(fā)生的類(lèi)KeyInputMonitor,這個(gè)類(lèi)用于監(jiān)控鍵盤(pán)按鍵的輸入并觸發(fā)一個(gè)事件:

internal class KeyInputMonitor 
{
  // 創(chuàng)建一個(gè)委托,返回類(lèi)型為void,兩個(gè)參數(shù)
  public delegate void KeyDownHandler( object sender, KeyEventArgs e );
  // 將創(chuàng)建的委托和特定事件關(guān)聯(lián),在這里特定的事件為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:
        // 得到按鍵信息的參數(shù)
        KeyEventArgs keyEventArgs = new KeyEventArgs( responsechar );
        // 觸發(fā)事件
        KeyDown( this, keyEventArgs );
        break;
      }
    }
    while( !finished );
  }
}

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

3、最后創(chuàng)建一個(gè)事件接收方的類(lèi),這個(gè)類(lèi)先產(chǎn)生一個(gè)委托實(shí)例,再把這個(gè)委托實(shí)例添加到產(chǎn)生事件對(duì)象的事件列表中去,這個(gè)過(guò)程又叫訂閱事件。然后提供一個(gè)方法回顯按鍵信息。

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

4、看一下如何調(diào)用

public class MainEntryPoint
{
public static void Start() 
{
  // 實(shí)例化一個(gè)事件發(fā)送器
  KeyInputMonitor monitor = new KeyInputMonitor();
  // 實(shí)例化一個(gè)事件接收器
  EventReceiver eventReceiver = new EventReceiver( monitor );
  // 運(yùn)行
  monitor.Run();
}
}

總結(jié):

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

1.創(chuàng)建一個(gè)委托

2.將創(chuàng)建的委托與特定事件關(guān)聯(lián)(.Net類(lèi)庫(kù)中的很多事件都是已經(jīng)定制好的,所以他們也就有相應(yīng)的一個(gè)委托,在編寫(xiě)關(guān)聯(lián)事件處理程序--也就是當(dāng)有事件發(fā)生時(shí)我們要執(zhí)行的方法的時(shí)候我們需要和這個(gè)委托有相同的簽名)

3.編寫(xiě)事件處理程序

4.利用編寫(xiě)的事件處理程序生成一個(gè)委托實(shí)例

5.把這個(gè)委托實(shí)例添加到產(chǎn)生事件對(duì)象的事件列表中去,這個(gè)過(guò)程又叫訂閱事件

C#中事件產(chǎn)生和實(shí)現(xiàn)的流程:

1.定義A為產(chǎn)生事件的實(shí)例,a為A產(chǎn)生的一個(gè)事件

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

3.A由于用戶(hù)(程序編寫(xiě)者或程序使用者)或者系統(tǒng)產(chǎn)生一個(gè)a事件(例如點(diǎn)擊一個(gè)Button,產(chǎn)生一個(gè)Click事件)

4.A通過(guò)事件列表中的委托對(duì)象將這個(gè)事件通知給B

5.B接到一個(gè)事件通知(實(shí)際是B.b利用委托來(lái)實(shí)現(xiàn)事件的接收)

6.調(diào)用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();
  }
}

相關(guān)文章

  • C# ExecuteScalar()方法案例講解

    C# ExecuteScalar()方法案例講解

    這篇文章主要介紹了C# ExecuteScalar()方法案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • c#中LINQ的基本用法(三)

    c#中LINQ的基本用法(三)

    這篇文章介紹了c#中LINQ的基本用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下的相關(guān)資料
    2022-04-04
  • C#實(shí)現(xiàn)谷歌翻譯API示例代碼

    C#實(shí)現(xiàn)谷歌翻譯API示例代碼

    本篇文章主要介紹了C#實(shí)現(xiàn)谷歌翻譯API示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Winform窗體傳值的方法(示例)

    Winform窗體傳值的方法(示例)

    C#開(kāi)發(fā)windows應(yīng)用程序項(xiàng)目時(shí),不同窗口之間傳值有很多中方法,在此給大家介紹兩種比較常用的winform窗體傳值的方法,有需要的朋友可以參考下
    2015-08-08
  • Winform讓DataGridView左側(cè)顯示圖片

    Winform讓DataGridView左側(cè)顯示圖片

    本文主要介紹在如何讓DataGridView左側(cè)顯示圖片,這里主要講解重寫(xiě)DataGridView的OnRowPostPaint方法,需要的朋友可以參考下。
    2016-05-05
  • C#?as?和?is?運(yùn)算符區(qū)別和用法示例解析

    C#?as?和?is?運(yùn)算符區(qū)別和用法示例解析

    在C#中,as?和?is?關(guān)鍵字都用于處理類(lèi)型轉(zhuǎn)換的運(yùn)算符,但它們有不同的用途和行為,本文我們將詳細(xì)解釋這兩個(gè)運(yùn)算符的區(qū)別和用法,需要的朋友可以參考下
    2025-01-01
  • 在C#中基于Semantic?Kernel的檢索增強(qiáng)生成(RAG)實(shí)踐記錄

    在C#中基于Semantic?Kernel的檢索增強(qiáng)生成(RAG)實(shí)踐記錄

    SemanticKernel是一個(gè)用于集成和操作大語(yǔ)言模型的應(yīng)用程序框架,支持C#、Python和Java等多種編程語(yǔ)言,通過(guò)SemanticKernel,開(kāi)發(fā)者可以輕松構(gòu)建基于最新AI技術(shù)的應(yīng)用程序
    2024-10-10
  • 輕松學(xué)習(xí)C#的正則表達(dá)式

    輕松學(xué)習(xí)C#的正則表達(dá)式

    輕松學(xué)習(xí)C#的正則表達(dá)式,對(duì)C#的正則表達(dá)式感興趣的朋友可以參考本篇文章,幫助大家更靈活的運(yùn)用C#的正則表達(dá)式
    2015-11-11
  • C#自定義控件指示燈效果

    C#自定義控件指示燈效果

    在C#中實(shí)現(xiàn)一個(gè)指示燈控件,可以通過(guò)GDI+技術(shù)繪制,首先使用Pen對(duì)象繪制外環(huán),然后用SolidBrush對(duì)象填充內(nèi)圓,通過(guò)RectangleF定義繪制和填充的邊界,控件的屬性包括顏色、間隙、外環(huán)寬度等,本文給大家介紹C#自定義控件指示燈效果,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • C#不可變類(lèi)型深入解析

    C#不可變類(lèi)型深入解析

    這篇文章主要介紹了C#不可變類(lèi)型,對(duì)于C#程序員深入理解string數(shù)據(jù)類(lèi)型有很大的幫助,需要的朋友可以參考下
    2014-08-08

最新評(píng)論