一、事件和委托
1、委托的本质是一个密封类,该类继承自MulticastDelegate(多播委托:一个委托可以装载多个相同签名的方法,委托被调用时,方法依次执行),委托的参数是方法
2、委托的构造函数,有两个参数target和method。其中,method是用来接收方法的。
3、委托可以同步调用(Invoke),也可以异步调用(BeginInvoke、EndInvoke)
4、 委托和类及接口同级,可以定义在类外面,也可以定义在类里面,委托绑定的方法可以是静态方法、非静态方法和匿名方法
5、事件是委托的代理,可看作委托类型的变量
6、通过事件注册、取消多个委托或方法,实现方法的多态
委托是一个类,该类内部维护着一个字段,指向一个方法(即对一类方法的抽象);
事件是委托类型的变量,通过事件注册(+=)或取消(-=)方法。
最终,在具体方法和委托之间建立关联,将方法作为参数传入,以实现方法的多态。
二、实例:经典面试题
public delegate void ScreamHandler();//委托定义在类外面,且是public
public class Cat
{
public event ScreamHandler OnScream;//事件定义在类里面,是委托类型变量
public void Scream()
{
Console.WriteLine("猫叫了一声");
OnScream?.Invoke();
}
}
public class Mouse
{
public Mouse(Cat c)
{
c.OnScream += () => //给事件注册方法1
{
Console.WriteLine("老鼠跑了");
};
}
}
public class People
{
public People(Cat c)
{
c.OnScream += () => //给事件注册方法2
{
Console.WriteLine("主人醒来了");
};
}
}
调用:
Cat cat = new Cat();
Mouse m = new Mouse(cat);
People p = new People(cat);
cat.Scream();
顺序执行:猫叫了;老鼠跑了;主人醒来了。
三、C#中预置委托
Action 无参没有返回值的委托
Action<> 没有返回值的泛型委托
Func<> 有返回值的泛型委托 //最后一个参数是返回值类型
Predicate<> 返回bool值,一个参数
参考链接:
https://www.jb51.net/article/165610.htm