服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#中事件处理的个人体会

C#中事件处理的个人体会

2020-12-15 16:55juky_huang C#

事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发(触发)事件的对象叫做事件发送方。捕获事件并对其作出响应的对象叫做事件接

事件的简单解释:

事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发(触发)事件的对象叫做事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。

在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NETFramework定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。

与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。

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

创建一个委托

将创建的委托与特定事件关联(.Net类库中的很多事件都是已经定制好的,所以他们也就有相应的一个委托,在编写关联事件处理程序--也就是当有事件发生时我们要执行的方法的时候我们需要和这个委托有相同的签名)

编写事件处理程序

利用编写的事件处理程序生成一个委托实例

把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件

C#中事件产生和实现的流程:

定义A为产生事件的实例,a为A产生的一个事件

定义B为接收事件的实例,b为处理事件的方法

A由于用户(程序编写者或程序使用者)或者系统产生一个a事件(例如点击一个Button,产生一个Click事件)

A通过事件列表中的委托对象将这个事件通知给B

B接到一个事件通知(实际是B.b利用委托来实现事件的接收)

调用B.b方法完成事件处理

下面给出《C#入门经典》的例子,并做一定的解释:

//====================Connection.cs===========

//事件定义,也就是上面提到的A

//============================================

usingSystem;

usingSystem.Timers;

namespaceCh12Ex02

{

///

 

///Connection的摘要说明。

///

 

///

publicdelegatevoidMessageHandler(stringmessageText);//创建一个委托---步骤1

publicclassConnection

{

publiceventMessageHandlerMessageArrived;//将创建的委托和特定事件关联,在这里特定的事件为MessageArrived---步骤2*/

/*上面这语句值得注意的地方是MessageArrived方法被关联到MessageHandler上后,以后消息的传递就通过MessageHandler这个委托来实现,所以如果要能接收这个消息,就必须能支持MessageHandler这个委托,也就是要有一个和委托一样的签名

privateTimerpollTimer;

publicConnection()

{

//

//TODO:在此处添加构造函数逻辑

//

pollTimer=newTimer(100);

pollTimer.Elapsed+=newElapsedEventHandler(CheckForMessage);

}

publicvoidConnect()

{

pollTimer.Start();

}

publicvoidDisconnect()

{

pollTimer.Stop();

}

publicvoidCheckForMessage(objectsender,ElapsedEventArgse)

{

Console.WriteLine("Checkformessage.");

Randomrandom=newRandom();

if((random.Next(9)==0)&&(MessageArrived!=null))

{

MessageArrived("HelloMum!");//程序编写者自己产生一个消息,消息的内容为HelloMum!

}

}

}

}

//====================Display.cs===========

//接收事件的类,也就是上面提到的B

//=========================================

usingSystem;

namespaceCh12Ex02

{

///

 

///Display的摘要说明。

///

 

publicclassDisplay

{

publicDisplay()

{

//

//TODO:在此处添加构造函数逻辑

//

}

publicvoidDisplayMessage(stringmessage)//a事件的最终处理函数,即上面的B.b,在main函数中,我们会使用本函数实现一个委托实例,并且添加到A的MessageArrived事件列表中--步骤3

{

Console.WriteLine("MessageArrived:{0}",message);

}

}

}

//====================Class1.cs=================

//一个控制台可执行类,主要是使用上面两个类的实例

//==============================================

usingSystem;

namespaceCh12Ex02

{

///

 

///Class1的摘要说明。

///

 

classClass1

{

///

 

///应用程序的主入口点。

///

 

[STAThread]

staticvoidMain(string[]args)

{

//

//TODO:在此处添加代码以启动应用程序

//

ConnectionmyConnection=newConnection();

DisplaymyDisplay=newDisplay();

myConnection.MessageArrived+=newMessageHandler(myDisplay.DisplayMessage);//把委托添加到当前A的事件列表中----步骤4和步骤5

myConnection.Connect();

Console.ReadLine();

}

}

}

值得注意的代码:

publicdelegatevoidMessageHandler(stringmessageText);//委托定义

publiceventMessageHandlerMessageArrived;//定义一个事件,并且关联到一个委托上

myConnection.MessageArrived+=newMessageHandler(myDisplay.DisplayMessage);//产生一个委托实例,并通过+=运算符号添加到事件列表中+=运算符号在这里非常的有用.

延伸 · 阅读

精彩推荐
  • C#C# 后台处理图片的几种方法

    C# 后台处理图片的几种方法

    本篇文章主要介绍了C# 后台处理图片的几种方法,非常具有实用价值,需要的朋友可以参考下。...

    IT小伙儿10162021-12-08
  • C#C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】

    C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】

    这篇文章主要介绍了C#实现的文件操作封装类,结合完整实例形式分析了C#封装文件的删除,移动,复制,重命名等操作相关实现技巧,需要的朋友可以参考下...

    Rising_Sun3892021-12-28
  • C#浅谈C# winForm 窗体闪烁的问题

    浅谈C# winForm 窗体闪烁的问题

    下面小编就为大家带来一篇浅谈C# winForm 窗体闪烁的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网7962021-12-21
  • C#Unity3D UGUI实现缩放循环拖动卡牌展示效果

    Unity3D UGUI实现缩放循环拖动卡牌展示效果

    这篇文章主要为大家详细介绍了Unity3D UGUI实现缩放循环拖动展示卡牌效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参...

    诗远3662022-03-11
  • C#c#学习之30分钟学会XAML

    c#学习之30分钟学会XAML

    一个界面程序的核心,无疑就是界面和后台代码,而xaml就是微软为构建应用程序界面而创建的一种描述性语言,也就是说,这东西是搞界面的...

    C#教程网8812021-12-10
  • C#C#直线的最小二乘法线性回归运算实例

    C#直线的最小二乘法线性回归运算实例

    这篇文章主要介绍了C#直线的最小二乘法线性回归运算方法,实例分析了给定一组点,用最小二乘法进行线性回归运算的实现技巧,具有一定参考借鉴价值,需要...

    北风其凉8912021-10-18
  • C#C#基础之泛型

    C#基础之泛型

    泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。接下来通过本文给大家介绍c#基础之泛型,感兴趣的朋友一起学习吧...

    方小白7732021-12-03
  • C#聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题,新手速来围观,一个通俗易懂的例子帮助大家更好的理解C#接口问题,感兴趣的小伙伴们可以参考一下...

    zenkey7072021-12-03