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事件中有两个很重要的特性:事件冒泡以及目标元素. 事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这 一过程被 ...
随机推荐
- ubuntu12.04离线安装libjpeg62-dev
0:如果的电脑能连接上网络,用apt-get install安装最爽,我的情况是:公司电脑用的内网,访问不了外网,而且不让访问外网,安装软件只能用u盘拷进去再安装,所以我用如下方法 1:下载安装包,地 ...
- 转载——Android permission 访问权限大全
程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: Android.permission.ACCESS_CHECKIN_PROPERTIES ...
- Block和inline元素对比
所有的HTML元素都属于block和inline之一.block元素的特点是:总是在新行上开始:高度,行高以及顶和底边距都可控制:宽度缺省是它的容器的100%,除非设定一个宽度<div>, ...
- MySQL学习笔记(五)—— 子查询及联结
子查询: 子查询,即嵌套在其他查询中的查询.例如我们有这样几个表,顾客表,订单表,商品表,我们想知道有哪些客户买了商品A,那么我们就需要先查看哪些订单里包含了商品A,然后根据订单查出是哪些客户. my ...
- 详细阐述ping命令中请求超时与无法访问的区别
1.Request timed out 这是大家经常碰到的提示信息,很多文章中说这是对方机器置了过滤ICMP数据包,从上面工作过程来看,这是不完全 正确的,至少有下几种情况. (1) 对方已关机,或者 ...
- 如何把wecenter的推荐的问题模块单独调取出来?
查阅文档: http://wenda.wecenter.com/question/1893 http://www.zhidiu.com/article/1012 http://wenda.wecent ...
- c# 容器类简介
c# 容器类简介 C# 中主要有两类容器:一个是 System.Array 类(参阅:http://msdn.microsoft.com/library/default.asp?url=/libr ...
- Springboot框架中request.getInputStream()获取不到上传的文件流
Springboot框架中用下面的代码,使用request.getInputStream()获取不到上传的文件流 @PostMapping("/upload_img") publi ...
- Floyd算法(弗洛伊德算法) 百度百科
核心代码 for(int k=1; k<=NODE; ++k)//对于每一个中转点 for(int i=0; i<=NODE; ++i)//枚举源点 for(int j=0; j<= ...
- 字面量(literal)与 C 语言复合字面量(compound literals)
在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)(字面量是相对变量常量等定义的,无论是常量还是变量,其值在某一时刻总是确定的,只是变量可以反复赋值.刷新 ...