当前位置:
首页 > Python基础教程 >
-
C#教程之事件入门
上文 c#委托事件入门--第一讲:委托入门 中和大家介绍了委托,学习委托必不可少的就要说下事件。以下思明仍然从事件是什么、为什么用事件、怎么实现事件和总结介绍一下事件
1、事件是什么:.
1.1 NET事件建立在委托机制之上,事件是对委托的封装。
1.2 事件的分类: 强类型事件和弱类型事件
2、为什么用事件:
从上文委托入门介绍中我们可以了解到,我们可以在客户端随意对委托进行操作,一定程度上破坏了面向对象的封装机制,因此事件的出现就是为了实现对委托的封装
3、怎么实现事件:
其实事件的定义很简单,但是需要依赖委托:关键字event就是事件的标识
/// <summary> /// 1、定义一个委托 /// </summary> /// <param name="x"></param> public delegate void BoilHandler(int x); /// <summary> /// 2、声明一个事件 /// </summary> public event BoilHandler boilHandler;
也就是在上文介绍委托入门的代码中。声明一个委托的方法上加上关键字event即可,
完整代码如下:
using System; namespace DelegateDemo { public class Program { public void Write1(int x, int y) { Console.WriteLine("{0}+{1}={2}", x, y, x + y); } public static void Write2(int x, int y) { Console.WriteLine("{0}*{1}={2}", x, y, x * y); } static void Main(string[] args) { GManage gm = new GManage(); gm.delegate1 += new Program().Write1; //先给委托类型的变量赋值 gm.delegate1 += Program.Write2; //给此委托变量再绑定一个静态方法 gm.SayHello(1, 2); // 将先后调用 Write1 与 Write2 方法 Console.WriteLine("******解绑方法Write2后******"); gm.delegate1 -= Program.Write2; // 委托方法解绑 gm.SayHello(1, 2); // 解绑后只会调用 Write1 Console.ReadKey(); } } public class GManage { /// <summary> /// 1、定义委托,它定义了可以代表的方法的类型 /// </summary> /// <param name="x"></param> /// <param name="y"></param> public delegate void GreetingDelegate(int x, int y); /// <summary> /// 2、声明一个事件 /// </summary> public event GreetingDelegate delegate1; /// <summary> /// 3、被调用委托的方法 /// </summary> /// <param name="x"></param> /// <param name="y"></param> public void SayHello(int x,int y) { if (delegate1 != null) //如果有方法注册委托变量 { delegate1(x, y); //通过委托调用方法 } } } }
但是在实现注册的时候和委托的注册不一样,因为事件仅仅提供了 += 和 -= 两个对外的方法来实现方法的绑定和解绑,如果依旧使用 赋值符号 = ,程序即将报错。
4、总结
事件的本质就是委托,向外提供两个访问方法add_EventName(对应+=)和remove-EventName(对应-=)来实现方法的绑定和解绑,同时更符合面向对象的封装性和安全性。
码字不容易,转载请注明出处。谢谢
源码链接:https://github.com/YaoHigh/DelegateDemo
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式