什么是委托?
什么是指针?
C语言阐述:(图一:直接调用 图二:指针用法)
一切皆地址 √
无论是数据还是算法,皆保存在内存中,变量是寻找数据的地址,函数时寻找算法的地址
直接调用 和 间接调用
直接调用:通过函数名调用函数
间接调用:通过函数指针调用函数
委托的简单使用
Action和Func委托 实例
委托,其实就是函数指针的升级版。完成间接调用。
class Program
{
static void Main(string[] args)
{
Calculator cal = new Calculator();
Action action = new Action(cal.Report);//Action委托指向cal.Report这个方法
cal.Report();//直接调用
action.Invoke();//间接调用(简便写法:action();)
//Func<in T1,in T2,out TResult> 等价于 Func<参数1,参数2,返回值类型>
Func<int, int,int> func1 = new Func<int, int,int>(cal.Add);
Func<int, int, int> func2 = new Func<int, int, int>(cal.Sub);
int result1 = func1.Invoke(1,2);
int result2 = func2.Invoke(1, 2);
Console.WriteLine(result1);
Console.WriteLine(result2);
//无参数用Action委托;有参数用Func委托
}
}
class Calculator
{
public void Report(){
Console.WriteLine("I have 3 methods");
}
public int Add(int a, int b){
int result = a + b;
return result;
}
public int Sub(int a, int b){
int result = a - b;
return result;
}
}
委托的声明(自定义委托)
委托是一种类!!!
委托必须和封装的方法保持“类型兼容”!!!
public delegate double Calc(double x, double y);//声明自定义委托类型
class Program{
static void Main(string[] args)
{
Calculator calculator = new Calculator();//创建类实例
Calc cal = new Calc(calculator.Add);//创建自定义委托
cal += calculator.Sub;//给自定义委托 添加 委托方法
cal(100,200);//或者 cal.Invoke(100, 200);
}
}
class Calculator{ //以下的方法类型都兼容(double , double)
public double Add(double a, double b){
Console.WriteLine(a + b);
return a + b;
}
public double Sub(double a, double b){
Console.WriteLine(a - b);
return a - b;
}
}
委托的使用
委托的一般使用
模板方法:
优点: ①最大限度地实现代码的重复使用。
回调方法:
切勿滥用!!!
老师的反面案例:非常非常乱!
委托的高级使用
多播委托
单播委托 案例
一个委托封装一个方法的形式
多播委托 案例
一个委托封装多个方法的形式
隐式异步调用
同步 与 异步 的概念:
同步:你做完了我接着做… 异步:咱们两个同时做…
同步调用 与 异步调用 的概念:
①每一个运行的程序是一个进程;每个进程可以由一个或多个线程。 ②同步调用是在同一线程内。即单线程内进行串行调用… ③异步调用的底层机理是多线程。即多线程内进行并行调用…
同步调用 与 异步调用
举例案例基础类:
直接同步调用 案例:
间接同步调用 案例:
常用于单播/多播委托…(该处使用多播委托)
隐式异步调用 案例:
常常在使用线程是会形成冲突,我们常常为其“加锁”解决问题。
适时使用接口(interface)取代委托的使用
案例如下: