上文 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(, ); // 将先后调用 Write1 与 Write2 方法 Console.WriteLine("******解绑方法Write2后******");
gm.delegate1 -= Program.Write2; // 委托方法解绑
gm.SayHello(, ); // 解绑后只会调用 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

最新文章

  1. 关于js实现分页效果的简单代码
  2. Kafka组件监控
  3. [leetcode]Second Highest Salary
  4. ORCHARD中文文档(翻译)
  5. Spring MVC设计模式
  6. [Java Basics] Stack, Heap, Constructor, I/O, Immutable, ClassLoader
  7. 【C++】命令行Hangman #2015年12月15日 00:20:27
  8. Gradle sync failed: failed to find Build Tools revision 21.1.2
  9. [转载]VIM命令合集
  10. p1217晚餐(简单的dijkstra)
  11. 转:request.getSession(true)和request.getSession(false)的区别
  12. 深入.NET数据类型(1)
  13. 学习ASP.NET Core Razor 编程系列三——创建数据表及创建项目基本页面
  14. Objective-C的继承与组合
  15. python的位置参数、默认参数、关键字参数、可变参数区别
  16. 20165215 MySort的实现
  17. 模拟实现简单ATM功能
  18. find 以及linux 和windows 文件互传
  19. 2-Zookeeper、HA安装
  20. AddComponentRecursively

热门文章

  1. 关于js代码执行顺序
  2. vue链接传参与路由传参
  3. php中const与define的区别
  4. Kill 进程
  5. 执行查询&ldquo;BACKUP LOG [XXX] TO DISK = N'F:\\BackData\\事务日至备份\\...&rdquo;失败,错误如下:&ldquo;无法执行 BACKUP LOG,因为当前没有数据库备份。 BACKUP LOG 正在异常终止。
  6. Python中的单例模式的几种实现方式的优缺点及优化
  7. File API文件操作之FileReader
  8. timeline自适应时间轴
  9. 固定底部导航菜单-续集(BottomMenu-移动端V3.0)
  10. PostgreSQL查询优化器之grouping_planner