学习笔记: 委托解析和封装,事件及应用
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进行操作
从 IL中可以看出 委托实例是public字段, 而事件是 private字段, 自然外部不可调用了
委托和事件的区别与联系?
委托的本质 是类, 就是一个类型,比如 Student类
事件 是委托类型的一个实例 比如 同学A 是student的一个实例
事件: 可以吧一堆可变的动作/行为 封装出去, 交给外部制定, 预定义一样,
程序设计时候, 可以把程序分为2部分, 固有部分写死, 不固定部分开放接口,外部可随意扩展
框架: 完成固定/通用部分, 把可变部分留出扩展点, 支持自定义