委托 delegate
namespace 委托
{
internal class Class委托
{
//定义一个乘法函数
static double Multiply(double param1, double param2)
{
return param1 * param2;
}
//定义一个除法函数
static double Divide(double paeam1, double param2)
{
return paeam1 / param2;
}
//定义一个名为Mydelegate的委托,委托的返回值和参数与函数一致
delegate double MyDelegate(double param1, double param2);
static void Main(string[] agrs)
{
//使用委托调用了乘法函数
MyDelegate delegate1;
delegate1 = Multiply; //声明一个委托变量,首先指向Multiply
delegate1 = Divide; //指向发生改变
Console.WriteLine(delegate1(2,4)); //执行了除法函数
}
}
函数参数和返回值为空,怎么定义委托
//Test函数 参数列表和返回值为空 与上一个委托MyDekegate这个委托是不一致的
static void Test()
{
Console.WriteLine("Test");
}
//要想返回Test 要定义一个与Test函数参数类型与返回值一致的委托
delegate void Mydelegate2(); //使用这个委托声明的变量可以指向返回值参数为空的函数
static void Main(string[] agrs)
{
Mydelegate2 delegate3 = Test;
delegate3();
}
委托案例
//假设两个函数是两个开发者在同时开发
namespace 委托案例
{
internal class Class委托案例
{
delegate void OnDelegate();
//预留出来一个委托,后期可以随意调用
static void Play(OnDelegate onDie) //给了一个委托类型的参数onDie 这个委托相当于一个接口
{
Console.WriteLine("做任务");
Console.WriteLine("玩家正在战斗");
Console.WriteLine("死亡");
if (onDie != null)
{
onDie();
}
}
static void ShowDieUI()
{
Console.WriteLine("显示游戏死亡后的UI");
Console.WriteLine("返回首页UI");
}
static void Main(string[] agrs)
{
Play(ShowDieUI);
}
}
delegate_委托
MathOp_数学操作
DoubleOpDelegate
DoubleOpDelegate2(委托是个变量,它也可以当作一个参数去传递的)
Program(委托可以指向任意一个方法(静态方法或实例方法))
当你去调用一个委托的时候,这个委托是不能为空的,否则异常报错,避免委托为空的这种异常,可以通过if来判断是否为空
Action委托
Action只能指向没有返回值(void)的方法,参数可以有多个 Func必须指向有返回值的方法
Func委托
Func必须指向有返回值的方法 Action只能指向没有返回值(void)的方法
多播委托
在整个架构里,action1既指向了Test1又指向了Test2,所以叫多播委托
异步委托
异步委托的方式启动线程