惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
B
Blog
博客园_首页
云风的 BLOG
云风的 BLOG
S
SegmentFault 最新的问题
罗磊的独立博客
Jina AI
Jina AI
C
Check Point Blog
Martin Fowler
Martin Fowler
J
Java Code Geeks
博客园 - 司徒正美
美团技术团队
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
大猫的无限游戏
大猫的无限游戏
有赞技术团队
有赞技术团队
U
Unit 42
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
小众软件
小众软件

博客园 - BearOcean

LOG.ZS.0001.基于Freetype的游戏字体渲染优化思路 const 和指针 C++ 下啥时候用struct, 啥时候用class C++ 和 Java 中的变参 解决站点关键数据,状态数据,无须持久化数据的一些思路 BS程序代码与安全与基本攻击/防御模式 Struts 实现的I18N Ant 阅读笔记 进度,效率,与个人事务管理 Personal Task 1.0 MySql与Java的时间类型 数据挖掘概述 解决Thread 的关闭问题和参数传递时想到的办法. Command 模式 .Net标准控件与自定义控件(2) ToolTipButton 内网聊天工具FreeChat 2.0 FreeChat 2.0 ...大改 模型和架构 局域网聊天工具FreeChat 1.0 开发日志 内网聊天工具FreeChat Beta 为Socket写的附加方法
.Net 事件
BearOcean · 2006-01-02 · via 博客园 - BearOcean

事件是存在于类当中的一种特殊成员.
抽象上来说是一种很好理解的东西.
既是在特定情况下(如用户按下鼠标左键)激活一个事件.然后由另外一个
实体(如后台程序)通过预先建立好的联系,在得到事件已发生以后对该特
定事件进行处理.

所以事件模型需要一些必须的要素:
(1)事件源需要定义一个事件.
(2)事件源需要有一张"事件发生后通知谁"的列表.
(3)事件接收方需要定义能够接收哪些事件.
(4)事件接收方需要定义事件发生后进行何种处理的处理方法.

在C#中,事件模型是通过如下方式实现的:
在类A中申明一个事件:

class A
{
 .....
 public:
      event EventHanlder SomeEvent;
 .....
}

解释一下代码:
event:
指定一个事件时使用的关键字.

EventHanlder :
一个委托(delegate),申明如下:
public delegate void EventHandler( object sender , EventArgs e )

关于delegate,可以近似地认为是一个函数指针.
所以该"EventHanlder"实际上是希望与该事件发生联系的委托(delegate)

最后SomeEvent实际上是事件名.

event(关键字) EventHanlder(delegate) SomeEvent(事件名)

所以当我们定义一个事件:
event  EventHanlder Click 时,翻译成自然语言既是在说:我要把名为click的
事件委托给一个类型为delegate void EventHandler( object sender , EventArgs e )
的方法来处理.

第2段关键的代码:
 this.button1.Click += new System.EventHandler(this.button1_Click);
使用+=符号使事件Click与处理方法button1_Click方法关联起来.
也就是说,当Click事件被激活以后马上对button1_Click方法进行调用.

要注意的一点就是:因为事件实际上申明了要委托给型如:
void FuncName(object sender,EventArgs e)
的方法来处理.
所以button1_Click也一定要定义成:
button1_Click(object sender, EventArgs e)的形式.当然其实这些IDE都已经做好了,一般
情况下,不论是winform还是webform
只需要在方法里直接填代码就可以了.

再举一个例子:
分析正在做的项目,发现在Server.cpp中有这么一句: (C++.net)
OnRecieveData+=new AnalysisDataEventHanlder(this,&VSCServer::Recieve)
那么就是说在OnRecieveData事件与VSCServer::Recieve方法之间建立了联系.

然后在Server的基类:XSocket里找到了关于AnalysisDataEventHanlder的定义:
public __delegate int AnalysisDataEventHandler(String*)
和event的定义:
__event AnalysisDataEventHandler *OnReciveData;

仿佛事件与方法的关系已经建立了联系.
但是仍然有一点迷惑我,
那就是代码又怎么知道什么时候触发OnRecieveData事件呢?
按业务逻辑上来说,应该是在Socket接收到client发过来的消息后交给VSCServer::Recieve处理

那么是不是在 while(int i=Recieve(.....)!=0)
时激活OnReciveData.....那么这样的话又和在这里直接调用Recieve有什么关系?
是不是只是多了一个Event可以映射到多个方法而带来方便?

这个我还是不太理解 :_)