C# 特性之事件
事件的本质---特殊的多路广播委托
定义事件:


事件访问修饰符一般为public 定义为公共类型可以使事件对其他类可见
事件定义中还包括委托类型,既可以是自定义委托类型也可以是EventHandler(预定义)
运用"+="运算符来订阅事件,运用"-="运算符来取消订阅事件
例:自定义委托事件
class HelloWorld
{
//定义委托类型
public delegate void Marry(string msg);
//使用自定义委托类型定义事件
public event Marry MarryEvent;
//发出事件
public void News(string msg)
{
//判断是否绑定了事件处理方法
if(MarryEvent!=null)
{
//触发事件
MarryEvent(msg);
} }
static void Main(string[] args)
{
//初始化新郎官对象
HelloWorld helloWorld=new HelloWorld();
//实例化朋友
Friend zhangsan=new Friend("Zhangsan");
Friend lishi=new Friend("Lishi");
Friend zhaoliu=new Friend("Zhaoliu");
//订阅事件
helloWorld.MarryEvent += new Marry(zhangsan.SendMessage);
helloWorld.MarryEvent += new Marry(lishi.SendMessage);
helloWorld.MarryEvent += new Marry(zhaoliu.SendMessage);
//发出通知
helloWorld.News("他要结婚了,到时来");
Console.WriteLine("---------------------------------------");
//张三取消订阅
helloWorld.MarryEvent -= new Marry(zhangsan.SendMessage);
//发出通知
helloWorld.News("他要结婚了,到时来");
Console.ReadKey();
}
} class Friend
{
//字段
public string Name;
public Friend(string name)
{
Name = name;
}
//事件处理函数,该函数需要符合Marry委托定义
public void SendMessage(string message)
{
//输出信息
Console.WriteLine(message);
//对事件做出处理
Console.WriteLine("{0}收到了到时准时参加",Name);
} }
事件的订阅与取消
例:预定义委托事件
class HelloWorld
{
//使用自定义委托类型定义事件
public event EventHandler MarryEvent;
//发出事件
public void News(string msg)
{
//判断是否绑定了事件处理方法
if(MarryEvent!=null)
{
Console.WriteLine(msg);
//触发事件
MarryEvent(this,new EventArgs());
} }
static void Main(string[] args)
{
//初始化新郎官对象
HelloWorld helloWorld=new HelloWorld();
//实例化朋友
Friend zhangsan=new Friend("Zhangsan");
Friend lishi=new Friend("Lishi");
Friend zhaoliu=new Friend("Zhaoliu");
//订阅事件
helloWorld.MarryEvent += new EventHandler(zhangsan.SendMessage);
helloWorld.MarryEvent += new EventHandler(lishi.SendMessage);
helloWorld.MarryEvent += new EventHandler(zhaoliu.SendMessage);
//发出通知
helloWorld.News("他要结婚了,到时来");
Console.WriteLine("---------------------------------------");
//张三取消订阅
helloWorld.MarryEvent -= new EventHandler(zhangsan.SendMessage);
//发出通知
helloWorld.News("他要结婚了,到时来");
Console.ReadKey();
}
} class Friend
{
//字段
public string Name;
public Friend(string name)
{
Name = name;
}
//事件处理函数,该函数需要符合Marry委托定义
public void SendMessage(object s,EventArgs e)
{
//对事件做出处理
Console.WriteLine("{0}收到了到时准时参加",Name);
} }
使用预定义委托事件订阅与取消
运行结果:

例:EventArgs扩展
//自定义事件类型并使其带有事件数据
public class EventMsg : EventArgs
{
public string Msg; public EventMsg(string msg)
{
Msg = msg;
}
} class HelloWorld
{
//使用自定义委托类型定义事件
public event EventHandler MarryEvent;
//发出事件
public void News(string msg)
{ //判断是否绑定了事件处理方法
if(MarryEvent!=null)
{
//触发事件
MarryEvent(this, new EventMsg(msg));
} }
static void Main(string[] args)
{
//初始化新郎官对象
HelloWorld helloWorld=new HelloWorld();
//实例化朋友
Friend zhangsan=new Friend("Zhangsan");
Friend lishi=new Friend("Lishi");
Friend zhaoliu=new Friend("Zhaoliu");
//订阅事件
helloWorld.MarryEvent += new EventHandler(zhangsan.SendMessage);
helloWorld.MarryEvent += new EventHandler(lishi.SendMessage);
helloWorld.MarryEvent += new EventHandler(zhaoliu.SendMessage);
//发出通知
helloWorld.News("他要结婚了,到时来");
Console.WriteLine("---------------------------------------");
//张三取消订阅
helloWorld.MarryEvent -= new EventHandler(zhangsan.SendMessage);
//发出通知
helloWorld.News("他要结婚了,到时来");
Console.ReadKey();
}
} class Friend
{
//字段
public string Name;
public Friend(string name)
{
Name = name;
}
//事件处理函数,该函数需要符合Marry委托定义
public void SendMessage(object s,EventArgs e)
{
//对事件做出处理
Console.WriteLine("{0}收到了到时准时参加",Name);
} }
EventArgs扩展

在VS中可以用F12查看EventHandler的定义
public delegate void EventHandler(object sender, EventArgs e);
(1)该委托返回类型是void因此实例化委托类型的方法也要满足这点
(2)第一个参数sender负责保存对触发事件对象的引用,其类型为object
(3)第二个参数e保存事件数据,EventArgs类也是.NET类库中定义的类,它不保存任何火数据
C# 特性之事件的更多相关文章
- JS 事件代理
事件处理器:onclick.onmouseover.... 在传统的事件处理中,你需要为每一个元素添加或者是删除事件处理器.然而,事件处理器将有可能导致内存泄露或者是性能下降——你用得越多这种风险就越 ...
- JS事件冒泡
JavaSciprt事件中有两个很重要的特性:事件冒泡以及目标元素. 事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这 一过程被 ...
- 《JS高程》事件学习笔记
事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...
- JS 阻止浏览器默认行为和冒泡事件
JS 冒泡事件 首先讲解一下js中preventDefault和stopPropagation两个方法的区别: preventDefault方法的起什么作用呢?我们知道比如<a href=& ...
- JavaScript的事件代理(转)
如果你想给网页添加点JavaScript的交互性,也许你已经听过JavaScript的事件代理(event delegation),并且觉得这是那些发烧友级别的JavaScript程序员才会关心的什么 ...
- Jquery 页面元素动态添加后绑定事件丢失方法,非 live
代码1: 以此方法绑定的input框事件,在通过add按钮后用jquery绑定的事件 alert就会丢失 <input type="button" value="A ...
- 微软公有云事件中心(Azure Event Hubs)在开放物联网大会(OIOT)啼声初试
发布于 2014-12-29 作者 刘 天栋 2014年12月18日,InfoQ在京召开开放物联网大会(Open IOT Conference),微软开放技术(中国)资深项目经理陈岭在大会中针对 ...
- js事件对象--DOM中的事件对象/IE中的事件对象/跨浏览器的事件对象
事件对象 在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型,以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对 ...
- JS冒泡事件与处理
JavaSciprt事件中有两个很重要的特性:事件冒泡以及目标元素. 事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这 一过程被 ...
随机推荐
- Mac端博客发布工具推荐
引子 推荐一款好用的 Mac 端博客发布工具. 下载地址 echo 博客对接 这里以cnblog为例.接入类型为metawebblog,access point可以在cnblog的设置最下边找到,然后 ...
- 最大流EK算法
给定一个有向图G=(V,E),把图中的边看作 管道,每条边上有一个权值,表示该管道 的流量上限.给定源点s和汇点t,现在假设 在s处有一个水源,t处有一个蓄水池,问从 s到t的最大水流量是多少? 网络 ...
- 在springboot中使用Mybatis Generator的两种方式
介绍 Mybatis Generator(MBG)是Mybatis的一个代码生成工具.MBG解决了对数据库操作有最大影响的一些CRUD操作,很大程度上提升开发效率.如果需要联合查询仍然需要手写sql. ...
- SPOJ7258
传送门 这题可以参考平衡树求第k大的过程,需要预处理一下从当前节点往下走能走出多少个子串. 原本准备存个图用反向的topsort,发现极为麻烦,看了别人的代码后发现,他们按step大小用了基排,省了很 ...
- SpringMVC 注释@PathVariable
@PathVariable 是用来获得请求url中的动态参数的: @ResponseBody @RequestMapping(value="/pointUpload/{userid}&quo ...
- LuoguP4861 按钮
传送门 这题一眼看上去要解\(k^x \equiv 1(mod\ m)\)的最小正整数解. 于是我打了一个扩展BSGS 这题这样做算的答案一直是0的.不过有另一个定理欧拉定理,\(k^{\varphi ...
- 无向图hash
一个效果还行的 无向图hash判同构的方法 求出每个点向其它点的最短路,然后排序,然后按字符串拼接起来,再按每个点的字符串 排序后的rank 作为每一个点的初始hash值 然后每一轮,把每个点的相邻点 ...
- P2383 狗哥玩木棒
题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第一行是一个整数n表示测试 ...
- python程序的pypy加速
我们知道,python作为一种几乎是脚本语言的语言,其优点固然有,但是其有一个最大的缺点,就是运行速度没有办法和c,c++,java比.最近在些一些代码的时候也是碰到了这样的问题. 具体而言,pyth ...
- Dubbo原理与框架设计
Dubbo是常用的开源服务治理型RPC框架,在之前osgi框架下不同bundle之间的方法调用时用到过.其工作原理和框架设计值得开源技术爱好者学习和研究. 一.Dubbo的工作原理 调用关系说明 服务 ...