Delegate的使用
一,什么是Delegate
Delegate即委托,类似于C++的函数指针,可以将函数方法作为参数进行传递,
二,Delegate的定义
- 无参无返回值的委托
private delegate void MyDelegate1();//定义一个无参,无返回值的委托
private MyDelegate1 _myDelegate;//对委托进行初始化
public void main()
{
_myDelegate=fun1;
_myDelegate(1,2);//调用fun1
}
private void fun1()
{
Console.WriteLine("Hello World");
}
- 有参有返回值的委托
private delegate int MyDelegate2(int a,int b);//定义一个返回值为int,参数为两个int的委托
private MyDelegate2 _myDelegate;
public void main()
{
_myDelegate=fun2;
int ret =_myDelegate(1,2);
}
private int fun2(int a,int b)
{
return a+b;
}
三,Delegate的多播(Multicasting)
Delegate可以作为储存方法的容器,可以一次储存多个方法
使用“+=”可以将方法添加到委托当中,使用“-=”可以将方法从容器中移除
private delegate void MyDelegate3();
private MyDelegate3 _myDelegate;
public void main()
{
_myDelegate+=fun3;
_myDelegate+=fun4;
_myDelegate();
_myDelegate-=fun3;
_myDelegate-=fun4;
}
private void fun3()
{
Console.WriteLine("fun3 is called");
}
private void fun4()
{
Console.WriteLine("fun4 is called");
}
在调用委托前对委托中是否为空进行判断
public void main()
{
_myDelegate+=fun3;
_myDelegate+=fun4;
_myDelegate();
_myDelegate-=fun3;
_myDelegate-=fun4;
_myDelegate();//会产生no reference错误
_myDelegate?.Invoke();//安全的调用方法
}
四,封装好的继承于Delegate的Class
Action:存放没有回传值的方法
private Action _myAction;
private Action<int,string> _myAction2;
Func:存放有回传值的方法
private Func<int,int,int> _myFunc;//最后一个参数为Func的存放方法的回传值
五,Lambda表达式
private Func<int,int,int> _myFunc;
public void main()
{
_myFunc=(a,b)=>a+b;
var result=_myFunc?.Invoke(3,5);
}
六,Delegate实现Callback
使用delegate实现定时器效果
private async void Delay(int milliseconds,Action callback)
{
await Task.Delay(milliseconds);
callback?.Invoke();
}