Net中事件的用法之一
1.事件与委托的关系
委托是一种类型
事件是委托的一个实例
事件中涉及两种角色——事件发布者和事件订阅者。
事件发布者: 触发事件的对象称为事件发布者。
事件订阅者: 捕获事件并对其做出处理的对象称为事件订阅者。
2.事件的实例说明
namespace MyEvent
{
//委托的声明
public delegate void DoSometing(); /// <summary>
/// 委托与事件的关系
/// 委托是一种类型
/// 事件是委托的一个实例
/// </summary>
public class MyEvent
{
public DoSometing doSomethingDelegate;//委托的一个变量
public event DoSometing doSomethingEvent;//一个事件,就是委托的一个变量,加上了event关键字
//事件的使用
public void Invoke()
{
if (doSomethingEvent != null)
{
doSomethingEvent();
}
}
}
}
namespace MyEvent
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("欢迎来到流星小子博客学习");
MyEvent myEvent = new MyEvent();
// myEvent.doSomethingEvent += new DoSometing(ShowSomething);
myEvent.doSomethingEvent += ShowSomething;//为事件实例化
myEvent.Invoke();//触发事件
Console.Read();
}
private static void ShowSomething()
{
Console.WriteLine("ShowSomething");
}
}
}
3. 事件的发布者与订阅者实例
//新郎官,充当事件发布者角色
public class Bridegroom
{
//自定义委托
public delegate void MarryHandler(string msg);
//定义事件
public event MarryHandler MarryEvent; //发布事件
public void OnMarriageComing(string msg)
{
if(MarryEvent != null)
{
MarryEvent(msg);
}
}
} public class Friend
{
//属性
public string Name { get; set; }
//构造函数
public Friend(string name)
{
Name = name;
}
//事件处理函数,该函数需要符合 MarryHandler委托的定义
public void SendMessage(string message)
{
//输出通知信息
Console.WriteLine(message);
//对事件做出处理
Console.WriteLine(this.Name + "收到了,到时候准时参加");
}
}
static void Main(string[] args)
{
Bridegroom bridegroom = new Bridegroom();
Friend friend1 = new Friend("张三");
Friend friend2 = new Friend("李四");
Friend friend3 = new Friend("王五"); //使用 “+=” 来订阅事件
bridegroom.MarryEvent += new Bridegroom.MarryHandler(friend1.SendMessage);
bridegroom.MarryEvent += friend2.SendMessage; //发出通知,此时只有订阅了事件的对象才能收到通知
bridegroom.OnMarriageComing("朋友门,我要结婚了,到时候准时参加婚礼!");
Console.WriteLine("---------------------------------------------"); //使用 “-=” 来取消事件订阅,此时李四将收不到通知
bridegroom.MarryEvent -= friend2.SendMessage; //使用 “+=” 来订阅事件,此时王五可以收到通知
bridegroom.MarryEvent += friend3.SendMessage;
//发出通知
bridegroom.OnMarriageComing("朋友门,我要结婚了,到时候准时参加婚礼!");
Console.Read();
}
4. 输出结果

Net中事件的用法之一的更多相关文章
- webview中事件的用法
封装 MBProgressHud ==================================== #import "MBProgressHUD.h" @interface ...
- react.js 从零开始(五)React 中事件的用法
事件系统 虚拟事件对象 事件处理器将会传入虚拟事件对象的实例,一个对浏览器本地事件的跨浏览器封装.它有和浏览器本地事件相同的属性和方法,包括 stopPropagation() 和 prevent ...
- Net中事件的用法之二
1.委托与事件的区别 事件对权限做了控制 1.委托可以直接调用 事件不可以直接调用 2.委托允许外面直接赋值 事件不允许外面直接赋值 2.事件与委托的实例比较 using System; using ...
- [转载]js中return的用法
一.返回控制与函数结果,语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二.返回控制,无函数结果,语法为:return; 在大多数情况下,为事件处理函 ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- VC++ 浅谈VS2010中CMFCToolBar的用法
本文将给大家介绍Visual Studio 2010中CMFCToolBar的用法,CMFCToolBar可以让用户自定义工具栏图标,使用静态成员函数SetUserImages()将一个CMFCToo ...
- jQuery中on()方法用法实例详解
这篇文章主要介绍了jQuery中on()方法用法,实例分析了on()方法的功能及各种常见的使用技巧,并对比分析了与bind(),live(),delegate()等方法的区别,需要的朋友可以参考下 本 ...
- 转delphi中nil的用法
转自:http://blog.csdn.net/haiou327/article/details/6666124 delphi中nil的用法 和C++中的NULL一样的意思,指空值,它和0值不一样-- ...
- JavaScript中return的用法详解
JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...
随机推荐
- getter-setter方法练习
// // Kline.h #import <Foundation/Foundation.h> @interface Kline : NSObject { int _max; // 最高价 ...
- 简单的MAC的终端命令
今天小研究了一下MAC的终端命令,主要为了方便调试程序用,XCODE用不来啊... 在这里记下..防止丢失 pwd 当前工作目录 cd(不加参数) 进root cd(folder) 进入文件夹 cd ...
- ValueStack与ContentMap (ActionContext.getContext().getValueStack().set())
在方法 <action name="zilei" class="dtreeAction" method="zilei"> & ...
- 描述nginx中worker_processes、worker_cpu_affinity、worker_rlimit_nofile、worker_connections配置项的含义
worker_processes worker进程的数量,应小于等于cpu核心数,auto为当前主机cpu核心数 work_processes 4 worker_cpu_affinity 配置CPU亲 ...
- 02网络编程( socket套接字+TCP粘包 )
目录 02 网络编程 一.socket套接字编程 二.简易代码模板 2.1 服务端 2.2 客户端 三.通信循环及代码优化 四.黏包现象 五.struct模块 六.简易版本报头 七.上传文件数据 * ...
- 通过PEB寻找函数地址
通过PEB的Ldr参数(结构体定义为_PEB_LDR_DATA),遍历当前进程加载的模块信息链表,找到目标模块. 摘自PEB LDR DATA: typedef struct _PEB_LDR ...
- c++ 动态内存 动态数组
动态内存-动态数组 习题12.23 //连接字符串到动态数组 char *c = new char[20](); char a[] = "hello "; char b[] = & ...
- JAVA8学习——从使用角度深入Stream流(学习过程)
Stream 流 初识Stream流 简单认识一下Stream:Stream类中的官方介绍: /** * A sequence of elements supporting sequential an ...
- Spring源码之@Configuration注解解析
1.前言 Spring注解开发中,我们只需求要类上加上@Configuration注解,然后在类中的方法上面加上@Bean注解即可完成Spring Bean组件的注册.相较于之前的xml配置文件定 ...
- 『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员
目录 1.Python支持多层继承 (1)多层继承实现 (2)多层继承和多重继承区别 2.继承中的私有成员 (1)继承中父类私有属性和私有方法 (2)获取和修改私有属性值 1.Python支持多层继承 ...