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事件中有两个很重要的特性:事件冒泡以及目标元素. 事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这 一过程被 ...
随机推荐
- MFC窗口消息PostMessage和SendMessage
以前这些消息用得比较少,但是今天碰到了个事儿,我看非用消息不可. 事情是这样的,我在线程中需要刷新对话框上面的内容,但是每每执行到UpdateData时就出现了断言错误. 查了相关资料,发现这个可能是 ...
- 快速上手Ubuntu之安装篇——安装win7,Ubuntu16.04双系统【转】
本文转载自:http://blog.csdn.net/qq_28205153/article/details/52203512 Linux可以说是开发者的系统,对于开发者来说,Linux发行版不仅为我 ...
- 通用方法解决UITextFiled输入的时候,键盘遮挡问题
我们在用键盘录入的时候,有可能会遮挡录入框,所以我们应调整UIView的位置,使其不被遮挡.我写了一个通用的方法可以解决这个问题:1. [代码][C/C++]代码 - (void) ...
- 记录ubuntu16.04版本安装过程中遇到的问题
记录ubuntu16.04版本安装和使用过程中遇到的些问题,方便以后查看,主要内容有: 1. ubuntu源替换 2. windows与vmware ubuntu文件夹共享 3. putty连接ubu ...
- vue.js created函数注意事项
因为created钩子函数是页面一加载完就会调用的函数,所以如果你想在这个组件拿值或者是赋值,很可能this里面能拿到数据,但是如果你用this.赋值的话,控制台或者debugger都会发现this里 ...
- JAVA 中的堆和栈
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new.n ...
- android项目源码
[置顶] Android精品开源项目整理_V20140221(持续更新中..) 让我们回顾下2013年有哪些精品资源:Android精品开源项目整理_V20131115(持续更新中..) 引言: ...
- iOS中判断基础字符(大小写、数字等的判断)
函数:isdigit 用法:#include 功能:判断字符c是否为数字 说明:当c为数字0-9时,返回非零值,否则返回零. 函数:islower 用法:#include 功能:判断字符c是否为小写英 ...
- NodeJS REST API with MySQL and Express
http://www.nodewiz.biz/nodejs-rest-api-with-mysql-and-express/ NPM Modules Express felixge/node-mysq ...
- 总结open与fopen的区别
https://www.zybuluo.com/yiltoncent/note/87461 参考链接1 参考链接2 对于这两个名字很类似的函数,对于很多初学者来说,不容易搞清楚它们有什么不同,只知道按 ...