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

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

博客园 - 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可以映射到多个方法而带来方便?

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