学习笔记: 委托解析和封装,事件及应用

1. 委托的本质: 是一个类, 继承自 System.MulticastDelegate 里面内置了几个方法

Noreturn委托 编译后的IL

 

 

1. 多播委托的 举例

        //猫叫一声 触发一系列后续动作
        //多个 指定动作 正式不稳定原因, 封装出去 甩锅

 

public class Cat
     {
         public int MyProperty { get; set; }
         public void Miao()
         {
             Console.WriteLine("{0} miao", this.GetType().Name);

            new Mouse().Run();
             new Baby().Cry();
             new Dog().Wang();
         }

        //猫叫一声 触发一系列后续动作
         //多个 指定动作 正式不稳定原因, 封装出去 甩锅

        public void MiaoNew(MiaoDelegate miaoDelegate)
         {
             Console.WriteLine("{0} MiaoNew", this.GetType().Name);

            if (miaoDelegate != null)
                 miaoDelegate.Invoke();
         }
     }

    public delegate void MiaoDelegate();
     class Mouse
     {
         public void Run()
         {
             Console.WriteLine("{0} run", this.GetType().Name);
         }
     }

    class Baby
     {
         public void Cry()
         {
             Console.WriteLine("{0} cry", this.GetType().Name);
         }
     }

    class Dog
     {
         public void Wang()
         {
             Console.WriteLine("{0} Wang", this.GetType().Name);
         }
     }

static void Main(string[] args)
{

    Cat cat = new Cat();
     cat.Miao();

    var miaoDelegate = new MiaoDelegate(new Mouse().Run);
     miaoDelegate += new MiaoDelegate(new Baby().Cry);
     miaoDelegate += new MiaoDelegate(new Baby().Cry);
     miaoDelegate += new MiaoDelegate(new Dog().Wang);

    cat.MiaoNew(miaoDelegate);
}

2. 对事件的理解

事件 : 带有event关键字的委托的实例, event可以限制变量被 外部调用/直接赋值

ChildClass:Cat 也不可以对cat中的 event进行操作

image

image

从 IL中可以看出  委托实例是public字段, 而事件是 private字段, 自然外部不可调用了

image

委托和事件的区别与联系?

委托的本质 是类, 就是一个类型,比如 Student类

事件 是委托类型的一个实例 比如 同学A 是student的一个实例

 

事件: 可以吧一堆可变的动作/行为 封装出去, 交给外部制定, 预定义一样,

        程序设计时候, 可以把程序分为2部分, 固有部分写死, 不固定部分开放接口,外部可随意扩展

框架: 完成固定/通用部分, 把可变部分留出扩展点, 支持自定义

posted @ 2018-06-07 10:54  小谭行天下  阅读(231)  评论(0编辑  收藏  举报