C#中事件處理的個(gè)人體會(huì)
更新時(shí)間:2006年12月27日 00:00:00 作者:
作者: juky_huang 事件的簡單解釋:
事件是對(duì)象發(fā)送的消息,以發(fā)信號(hào)通知操作的發(fā)生。操作可能是由用戶交互(例如鼠標(biāo)單擊)引起的,也可能是由某些其他的程序邏輯觸發(fā)的。引發(fā)(觸發(fā))事件的對(duì)象叫做事件發(fā)送方。捕獲事件并對(duì)其作出響應(yīng)的對(duì)象叫做事件接收方。
在事件通信中,事件發(fā)送方類不知道哪個(gè)對(duì)象或方法將接收到(處理)它引發(fā)的事件。所需要的是在源和接收方之間存在一個(gè)媒介(或類似指針的機(jī)制)。.NET Framework 定義了一個(gè)特殊的類型(Delegate),該類型提供函數(shù)指針的功能。
與其他的類不同,委托類具有一個(gè)簽名,并且它只能對(duì)與其簽名匹配的方法進(jìn)行引用。這樣,委托就等效于一個(gè)類型安全函數(shù)指針或一個(gè)回調(diào)。
C#中使用事件需要的步驟:
創(chuàng)建一個(gè)委托
將創(chuàng)建的委托與特定事件關(guān)聯(lián)(.Net類庫中的很多事件都是已經(jīng)定制好的,所以他們也就有相應(yīng)的一個(gè)委托,在編寫關(guān)聯(lián)事件處理程序--也就是當(dāng)有事件發(fā)生時(shí)我們要執(zhí)行的方法的時(shí)候我們需要和這個(gè)委托有相同的簽名)
編寫事件處理程序
利用編寫的事件處理程序生成一個(gè)委托實(shí)例
把這個(gè)委托實(shí)例添加到產(chǎn)生事件對(duì)象的事件列表中去,這個(gè)過程又叫訂閱事件
C#中事件產(chǎn)生和實(shí)現(xiàn)的流程:
定義A為產(chǎn)生事件的實(shí)例,a為A產(chǎn)生的一個(gè)事件
定義B為接收事件的實(shí)例,b為處理事件的方法
A由于用戶(程序編寫者或程序使用者)或者系統(tǒng)產(chǎn)生一個(gè)a事件(例如點(diǎn)擊一個(gè)Button,產(chǎn)生一個(gè)Click事件)
A通過事件列表中的委托對(duì)象將這個(gè)事件通知給B
B接到一個(gè)事件通知(實(shí)際是B.b利用委托來實(shí)現(xiàn)事件的接收)
調(diào)用B.b方法完成事件處理
下面給出《C#入門經(jīng)典》的例子,并做一定的解釋:
//====================Connection.cs===========
//事件定義,也就是上面提到的A
//============================================
using System;
using System.Timers;
namespace Ch12Ex02
{
/// <summary>
/// Connection 的摘要說明。
/// </summary>
///
public delegate void MessageHandler(string messageText);//創(chuàng)建一個(gè)委托---步驟1
public class Connection
{
public event MessageHandler MessageArrived;//將創(chuàng)建的委托和特定事件關(guān)聯(lián),在這里特定的事件為MessageArrived ---步驟2*/
/*上面這語句值得注意的地方是 MessageArrived方法被關(guān)聯(lián)到MessageHandler上后,以后消息的傳遞就通過MessageHandler這個(gè)委托來實(shí)現(xiàn),所以如果要能接收這個(gè)消息,就必須能支持MessageHandler這個(gè)委托,也就是要有一個(gè)和委托一樣的簽名
private Timer pollTimer;
public Connection()
{
//
// TODO: 在此處添加構(gòu)造函數(shù)邏輯
//
pollTimer=new Timer(100);
pollTimer.Elapsed+=new ElapsedEventHandler(CheckForMessage);
}
public void Connect()
{
pollTimer.Start();
}
public void Disconnect()
{
pollTimer.Stop();
}
public void CheckForMessage(object sender,ElapsedEventArgs e)
{
Console.WriteLine("Check for message.");
Random random=new Random();
if((random.Next(9)==0)&&(MessageArrived!=null))
{
MessageArrived("Hello Mum!");//程序編寫者自己產(chǎn)生一個(gè)消息,消息的內(nèi)容為Hello Mum!
}
}
}
}
//====================Display.cs===========
//接收事件的類,也就是上面提到的B
//=========================================
using System;
namespace Ch12Ex02
{
/// <summary>
/// Display 的摘要說明。
/// </summary>
public class Display
{
public Display()
{
//
// TODO: 在此處添加構(gòu)造函數(shù)邏輯
//
}
public void DisplayMessage(string message) //a事件的最終處理函數(shù),即上面的B.b,在main函數(shù)中,我們會(huì)使用本函數(shù)實(shí)現(xiàn)一個(gè)委托實(shí)例,并且添加到A的MessageArrived事件列表中--步驟3
{
Console.WriteLine("Message Arrived:{0}",message);
}
}
}
//====================Class1.cs=================
//一個(gè)控制臺(tái)可執(zhí)行類,主要是使用上面兩個(gè)類的實(shí)例
//==============================================
using System;
namespace Ch12Ex02
{
/// <summary>
/// Class1 的摘要說明。
/// </summary>
class Class1
{
/// <summary>
/// 應(yīng)用程序的主入口點(diǎn)。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此處添加代碼以啟動(dòng)應(yīng)用程序
//
Connection myConnection=new Connection();
Display myDisplay=new Display();
myConnection.MessageArrived+=new MessageHandler(myDisplay.DisplayMessage);//把委托添加到當(dāng)前A的事件列表中----步驟4和步驟5
myConnection.Connect();
Console.ReadLine();
}
}
}
值得注意的代碼:
public delegate void MessageHandler(string messageText);//委托定義
public event MessageHandler MessageArrived;//定義一個(gè)事件,并且關(guān)聯(lián)到一個(gè)委托上
myConnection.MessageArrived+=new MessageHandler(myDisplay.DisplayMessage);//產(chǎn)生一個(gè)委托實(shí)例,并通過+=運(yùn)算符號(hào)添加到事件列表中 +=運(yùn)算符號(hào)在這里非常的有用
事件是對(duì)象發(fā)送的消息,以發(fā)信號(hào)通知操作的發(fā)生。操作可能是由用戶交互(例如鼠標(biāo)單擊)引起的,也可能是由某些其他的程序邏輯觸發(fā)的。引發(fā)(觸發(fā))事件的對(duì)象叫做事件發(fā)送方。捕獲事件并對(duì)其作出響應(yīng)的對(duì)象叫做事件接收方。
在事件通信中,事件發(fā)送方類不知道哪個(gè)對(duì)象或方法將接收到(處理)它引發(fā)的事件。所需要的是在源和接收方之間存在一個(gè)媒介(或類似指針的機(jī)制)。.NET Framework 定義了一個(gè)特殊的類型(Delegate),該類型提供函數(shù)指針的功能。
與其他的類不同,委托類具有一個(gè)簽名,并且它只能對(duì)與其簽名匹配的方法進(jìn)行引用。這樣,委托就等效于一個(gè)類型安全函數(shù)指針或一個(gè)回調(diào)。
C#中使用事件需要的步驟:
創(chuàng)建一個(gè)委托
將創(chuàng)建的委托與特定事件關(guān)聯(lián)(.Net類庫中的很多事件都是已經(jīng)定制好的,所以他們也就有相應(yīng)的一個(gè)委托,在編寫關(guān)聯(lián)事件處理程序--也就是當(dāng)有事件發(fā)生時(shí)我們要執(zhí)行的方法的時(shí)候我們需要和這個(gè)委托有相同的簽名)
編寫事件處理程序
利用編寫的事件處理程序生成一個(gè)委托實(shí)例
把這個(gè)委托實(shí)例添加到產(chǎn)生事件對(duì)象的事件列表中去,這個(gè)過程又叫訂閱事件
C#中事件產(chǎn)生和實(shí)現(xiàn)的流程:
定義A為產(chǎn)生事件的實(shí)例,a為A產(chǎn)生的一個(gè)事件
定義B為接收事件的實(shí)例,b為處理事件的方法
A由于用戶(程序編寫者或程序使用者)或者系統(tǒng)產(chǎn)生一個(gè)a事件(例如點(diǎn)擊一個(gè)Button,產(chǎn)生一個(gè)Click事件)
A通過事件列表中的委托對(duì)象將這個(gè)事件通知給B
B接到一個(gè)事件通知(實(shí)際是B.b利用委托來實(shí)現(xiàn)事件的接收)
調(diào)用B.b方法完成事件處理
下面給出《C#入門經(jīng)典》的例子,并做一定的解釋:
//====================Connection.cs===========
//事件定義,也就是上面提到的A
//============================================
using System;
using System.Timers;
namespace Ch12Ex02
{
/// <summary>
/// Connection 的摘要說明。
/// </summary>
///
public delegate void MessageHandler(string messageText);//創(chuàng)建一個(gè)委托---步驟1
public class Connection
{
public event MessageHandler MessageArrived;//將創(chuàng)建的委托和特定事件關(guān)聯(lián),在這里特定的事件為MessageArrived ---步驟2*/
/*上面這語句值得注意的地方是 MessageArrived方法被關(guān)聯(lián)到MessageHandler上后,以后消息的傳遞就通過MessageHandler這個(gè)委托來實(shí)現(xiàn),所以如果要能接收這個(gè)消息,就必須能支持MessageHandler這個(gè)委托,也就是要有一個(gè)和委托一樣的簽名
private Timer pollTimer;
public Connection()
{
//
// TODO: 在此處添加構(gòu)造函數(shù)邏輯
//
pollTimer=new Timer(100);
pollTimer.Elapsed+=new ElapsedEventHandler(CheckForMessage);
}
public void Connect()
{
pollTimer.Start();
}
public void Disconnect()
{
pollTimer.Stop();
}
public void CheckForMessage(object sender,ElapsedEventArgs e)
{
Console.WriteLine("Check for message.");
Random random=new Random();
if((random.Next(9)==0)&&(MessageArrived!=null))
{
MessageArrived("Hello Mum!");//程序編寫者自己產(chǎn)生一個(gè)消息,消息的內(nèi)容為Hello Mum!
}
}
}
}
//====================Display.cs===========
//接收事件的類,也就是上面提到的B
//=========================================
using System;
namespace Ch12Ex02
{
/// <summary>
/// Display 的摘要說明。
/// </summary>
public class Display
{
public Display()
{
//
// TODO: 在此處添加構(gòu)造函數(shù)邏輯
//
}
public void DisplayMessage(string message) //a事件的最終處理函數(shù),即上面的B.b,在main函數(shù)中,我們會(huì)使用本函數(shù)實(shí)現(xiàn)一個(gè)委托實(shí)例,并且添加到A的MessageArrived事件列表中--步驟3
{
Console.WriteLine("Message Arrived:{0}",message);
}
}
}
//====================Class1.cs=================
//一個(gè)控制臺(tái)可執(zhí)行類,主要是使用上面兩個(gè)類的實(shí)例
//==============================================
using System;
namespace Ch12Ex02
{
/// <summary>
/// Class1 的摘要說明。
/// </summary>
class Class1
{
/// <summary>
/// 應(yīng)用程序的主入口點(diǎn)。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此處添加代碼以啟動(dòng)應(yīng)用程序
//
Connection myConnection=new Connection();
Display myDisplay=new Display();
myConnection.MessageArrived+=new MessageHandler(myDisplay.DisplayMessage);//把委托添加到當(dāng)前A的事件列表中----步驟4和步驟5
myConnection.Connect();
Console.ReadLine();
}
}
}
值得注意的代碼:
public delegate void MessageHandler(string messageText);//委托定義
public event MessageHandler MessageArrived;//定義一個(gè)事件,并且關(guān)聯(lián)到一個(gè)委托上
myConnection.MessageArrived+=new MessageHandler(myDisplay.DisplayMessage);//產(chǎn)生一個(gè)委托實(shí)例,并通過+=運(yùn)算符號(hào)添加到事件列表中 +=運(yùn)算符號(hào)在這里非常的有用
相關(guān)文章
WPF實(shí)現(xiàn)上下滾動(dòng)字幕效果
這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)上下滾動(dòng)字幕效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Unity實(shí)現(xiàn)攻擊范圍檢測并繪制檢測區(qū)域
這篇文章主要介紹了Unity實(shí)現(xiàn)攻擊范圍檢測并繪制檢測區(qū)域,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04C#基于FTP協(xié)議的簡易軟件自動(dòng)升級(jí)程序
這篇文章主要為大家詳細(xì)介紹了C#基于FTP協(xié)議的簡易軟件自動(dòng)升級(jí)程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03解決C# winForm自定義鼠標(biāo)樣式的兩種實(shí)現(xiàn)方法詳解
本篇文章是對(duì)在C#中winForm自定義鼠標(biāo)樣式的兩種實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Unity中 ShaderGraph 實(shí)現(xiàn)旋渦傳送門效果入門級(jí)教程(推薦)
通過Twirl 旋轉(zhuǎn)節(jié)點(diǎn)對(duì)Gradient Noise 梯度噪聲節(jié)點(diǎn)進(jìn)行操作,就可得到一個(gè)旋轉(zhuǎn)的旋渦效果。具體實(shí)現(xiàn)代碼跟隨小編一起通過本文學(xué)習(xí)下吧2021-07-07.net(c#)中的new關(guān)鍵字詳細(xì)介紹
在 C# 中,new 關(guān)鍵字可用作運(yùn)算符、修飾符或約束2013-10-10Unity5.6大規(guī)模地形資源創(chuàng)建方法
這篇文章主要為大家詳細(xì)介紹了Unity5.6大規(guī)模地形資源創(chuàng)建方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02