什么是委托
委托(delegate)是函数指针的“升级版”,字面意思是这有一件事件我自己不亲自做,委任给别人做,也就是间接的去做。
函数指针是C/C++中的概念
一切皆地址
变量(数据)是以某个地址为起点的一段内存中所储的值。
函数(算法)是以某个地址为起点的一段内存中所存储的一组机器语言指令。
变量也是就数据存在内存中,这个变量保存这个变量的地址,通过这个地址去找这个数据,这个数据的大小是这个变量的类型决定的。函数保存的是一组机器语言的指令地址,通过这个地址找到这一组机器语言指令,然后cpu一句一句的去执行这些指令,然后完成算法。所以无论数据还是算法都是保存在内存中,而变量和函数保存的是地址,变量保存是寻找数据的地址,函数保存的是算法的地址。
直接调用与间接调用
直接调用:通过函数名来调用函数,cpu通过函数直接获得函数所在地址并开始执行—>返回
间接调用:通过函数指针来调用函数,cpu通过读取函数指针存储的值获得函数所在地址并开始执行—>返回
java是从C/C++语言发展而来的,为了提高程序的安全性,java语言禁止程序员直接访问内存地址,也就是把指针函数舍弃掉了,没有了指钍程序员就是不能直接访问地址。C#也是从C/C++语言发展而来的,但是C#的通过委托这种数据类型保留了指钍这部分功能
委托的简单使用
Action委托
Func委托
自定义委托
nameespace DelegateExample
{
public delegate double Calc(double x,doule y);
//修饰访问符+声明委托关键字+返回值类型+名字(传值类型、个数)
class Program{
static void Main(string[] args){
Calcuator calculator = new Calcuator();
Calc calc1 = new Calc(calculator.Add);
Calc calc2 = new Calc(calculator.Sub);
Calc calc3 = new Calc(calculator.Sub);
double a = 100;
double b = 100;
double c = 0;
c = calc1(a,b);
Console.WriteLine(c);
c = calc2(a,b);
Console.WriteLine(c);
c = calc3(a,b);
Console.WriteLine(c);
}
}
class Calcuator {
public double Add(double x,double y){
return x+y;
}
public double Sub(double x,double y){
return x-y;
}
public double Sub(double x,double y){
return x*y;
}
}
}