有关委托和事件的文章已经有很多, 之前看过一篇讲的实例比较形象, 因此借鉴并加以改进一下, 希望能够帮助还没有过这道坎的同学;
借鉴文章: https://www.cnblogs.com/yinqixin/p/5056307.html
本文没有任何概念介绍,旨在帮助同学们快速用上委托和事件,越过这道坎。
应用场景举例:
刘备设鸿门宴, 吩咐关羽和张飞各自带队埋伏在门外, 刘备摔杯为号, 关羽和张飞则带队杀出;
关羽和张飞杀出的具体过程, 他们自己实现即可.
但刘备会不会摔杯, 什么时候摔杯 刘备自己也不知道..得看情况..
所以当然不能用传统方式, 在刘备摔杯的方法里面调用关羽和张飞的杀出方法,
如果刘备(BOSS)临时变卦, 要多安排赵云,马超,黄忠等等众多将领在门外呢?
那刘备的摔杯方法岂不是要调用所有将领的杀出方法?
这样写代码要传递众多将领对象, 刘备的摔杯方法会进行无尽的修改和完善,显然不是我们所希望的。
使用委托和事件的实现方式:
首先定义刘备,关羽,张飞3个类:
刘备有摔杯的委托和事件, 以及摔杯方法;
关羽和张飞则有杀出方法;

public class 刘备 { public delegate bool 摔杯委托(string str); public event 摔杯委托 摔杯事件; public void 摔杯方法() { if (摔杯事件 != null) 摔杯事件("猛猛的摔杯 (只是示例个参数)"); } } public class 关羽 { public bool 杀出(string str) { Console.WriteLine("关羽带300刀斧手从北门杀出!"); return true; } } public class 张飞 { public bool 杀出(string str) { Console.WriteLine("张飞带300刀斧手从南门杀出!"); return true; } }
那么为了方便大家理解注册事件, 也就是关羽和张飞接受刘备的摔杯为号的约定, 我们先这样写:

static class Program { static void Main() { 刘备 lb = new 刘备(); 关羽 gy = new 关羽(lb); 张飞 zf = new 张飞(lb); //分别注册事件 lb.摔杯事件 += gy.杀出; lb.摔杯事件 += zf.杀出; //刘备摔杯 lb.摔杯方法(); } }
最终完整代码如下:
(下面代码注册事件改为在对象内部实现)

using System; namespace Test { static class Program { static void Main() { 刘备 lb = new 刘备(); 关羽 gy = new 关羽(lb); //可以理解为, 刘备与关羽约定好摔杯杀出, 然后关羽自己注册事件 张飞 zf = new 张飞(lb); //同上 //刘备摔杯 lb.摔杯方法(); } } public class 刘备 { public delegate bool 摔杯委托(string str); public event 摔杯委托 摔杯事件; public void 摔杯方法() { if (摔杯事件 != null) 摔杯事件("猛猛的摔杯 (只是示例个参数)"); } } public class 关羽 { public 关羽(刘备 lb) { lb.摔杯事件 += 杀出; } public bool 杀出(string str) { Console.WriteLine("关羽带300刀斧手从北门杀出!"); return true; } } public class 张飞 { public 张飞(刘备 lb) { lb.摔杯事件 += 杀出; } public bool 杀出(string str) { Console.WriteLine("张飞带300刀斧手从南门杀出!"); return true; } } }
大家再想一想, 如果还有赵云,马超,黄忠等等更多将领呢?
程序拓展也非常方便, 定义好新将领的类并实现杀出方法即可, 和关羽张飞代码类似;
使用设计模式的话, 可以建立一个将领的父类, 实现基本的杀出方法. 如果个别将领有特别的杀出方法, 重写杀出方法即可.
如果有不对的地方欢迎指出