委托的定义
委托是声明了返回类型和参数组成一种数据类型
委托可以代理和委托签名(这里指返回类型和参数)一致的静态方法和实例方法
委托能存储方法的地址
委托是一类行为的抽象
当调用委托时就是调用了这个方法
委托的种类
单播委托 只绑定一个方法
多播委托 绑定多个方法,只返回最后一个方法的结果
Handler handler = new Handler(Fun);
handler=handler+new Handler(Fun2);//多播委托
有返回值时不适合多播委托,多播适合没有返回值的方法
委托的多种写法
public delegate int Handler(int a,int b);
//定义委托
Handler handler = new Handler(Fun);
//创建委托,方法一
Handler handler = Fun;
//简化,方法二
Handler handler = delegate(int a)
{
for (int i =0; i< a; i++)
Console. WriteLine("HAHA");
};
//匿名方法,不需要重用的时候,方法三
Handler handler = (p)=> {Console. WriteLine(p+ "HAHA");}
//lambda表达式,一个参数,一行代码时可以省略小括号和大括号,
//因为定义委托时就有参数类型,所以可以不写,方法四
handler(a,b);
//调用委托
public static int Fun(int a,int b)
{
return 0;
}
委托的作用
将方法做为参数传递,可以将一个方法的执行代码注入到另一个方法中
//调用端
A a=new A();
a.fun(()=>{});//可以直接传递lambda表达式或方法
//执行顺序1 3(括号里的方法) 5(结束)
public class A
{
public void fun(Handler handler)
{
handler();//2
其他语句//4
}
}
vpublic delegate void Handler();//定义委托
为什么要注入:
有的语句/步骤能定下来,有的暂时定不下来.
可以使用委托表示确定不下来的.
调用时再确定把有些功能推迟到调用端确定
实现回调,实现的方式比接口更灵活
回调就是方法写在调用端,可以随时换要用的方法
不确定的语句,不使用委托就要定义大量的类
委托事件实现的基础.
事件
事件是声明为委托类型的类的成员,表示类的偶发的行为,一旦这个行为发生,往往要引起其它行为的自动执行
事件是用来实现两个或多个行为的联动调用的。
1定义事件:public event【省略】委托类型事件名;
2注册事件:事件源对象.事件+=响应方法【简化的写法】
传统写法如下.
事件源对象.事件+=new委托类型(响应方法)
+=这里是注册符号,不同于复合加i+=1.
取消注册-=
3触发事件:事件在类内部触发,触发代码等同于用委托调用方法.
事件定义在哪里就在哪里触发
事件模式的缺点:代码繁琐.
事件模式的优点:平台可以封装共性常用的代码,程序员完成个性化的即可
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace delegateTest
{
delegate void Handler();
class Program
{
static void Main(string[] args)
{
LaoYing laoYing = new LaoYing();
XiaoJi xiaoJi = new XiaoJi();
Dog dog = new Dog();
laoYing.Chong += xiaoJi.TaoPao;
//使用顺序,第二步,绑定事件
laoYing.Chong += dog.Jiao;
laoYing.Fun();
//使用顺序,第四步,调用触发事件的方法
Console.ReadKey();
}
}
class LaoYing
{
public event Handler Chong;
//使用顺序,第一步,定义事件
public void Fun()
{
Console.WriteLine("老鹰冲");
if(Chong!=null)
{
Chong();
//使用顺序,第三步,触发事件
}
}
}
class XiaoJi
{
public void TaoPao()
{
Console.Write("小鸡逃跑");
}
}
class Dog
{
public void Jiao()
{
Console.Write("狗叫");
}
}
}