委托一堆知识,什么delegate,Action,Func,Lambda啥的,之前就用用LINQ表达式,完全不清楚他们啥关系,复杂一点的委托方法就GG,最近听了杨中科老师的课程,对委托有个新理解,同时做下记录,希望这个笔记能让大家更深刻清楚C#的委托
delegate
首先是delegate这个关键字,他可以声明一个委托,委托可以当成一个变量来对待,而他的赋值是一个方法
class Program
{
// 声明委托,包括参数,返回值
delegate int MyDelegate(int i, int j);
static void Main(string[] args)
{
// 此处赋值,必须参数,委托都对应的方法才能赋值
MyDelegate d1 = F1;
// 此处直接调用d1这个委托
Console.WriteLine(d1(1, 2));
}
static void F1(int i, int j)
{
Console.WriteLine("我是F1");
}
}
static int F1(int i, int j)
{
return i+j;
}
Action和Func
由于懒惰,delegate太复杂,于是delegate作为祖辈就产生Action和Func的后代,青出于蓝胜于了,他们好处就是简化定义。
- Action是无返回的Delegate,使用泛型<>来说明方法参数类型是什么,自定义参数数量,如下例子
Action<int,string> a=F1;//F1是(int,string)的无返回方法 a(1,"string类型");//调用
- Func是有返回的Delegata,使用泛型<
T
,T
,…,TResult
>定义参数类型与返回类型,如下例子Func<int, int, string> f1 = F1;//F1是(int,int)的方法,返回是string类型 f1(1,4);//调用
委托匿名方法
还是因懒于起名(实际是只使用一次的方法,或者很简单的方法),那委托方法就不给他起名吧,示例如下
Func<int,int,string> f1 = delegate (int i,int j){return $"{i},{j}"};
f1(1,3);
Lambda表达式
最终还是因为懒,就搞了个Lambda表达式,让委托写起来更简单
- 把delegate换成=>
Action<int,int> a1 = (int i,int j)=>{Console.WriteLine("输出一下");};
Func<int,int,string> f1 = (int i,int j)=>{return $"{i},{j}";};
- 后面的 (int i,int j) 有种脱裤子放屁的感觉,前面都说明是<int,int,string>了,谁不知道i和j的类型,那再懒惰点
Action<int,int> a1 = ( i, j)=>{Console.WriteLine("输出一下");};
Func<int,int,string> f1 = ( i, j)=>{return $"{i},{j}";};
- 你就一行return,Func都告诉我要return了,你还搞个一行用中括号,统统去掉就成了最终形式
Action<int,int> a1 = ( i, j)=>Console.WriteLine("输出一下");
Func<int,int,string> f1 = ( i, j)=> $"{i},{j}";
看委托
以前我一看这些委托就不知要咋处理,现在我们来随便看几个委托方法,让大家会解决委托这玩意
这个方法我们可以看到他是Action<ApiVersionOptions>
的委托,也就是他是无返回的,输入值是ApiVersionOptions
,也就可以使用这个对象改变配置
可以看出他是Func<IServiceProvider, THostedService>
的委托,也就是输入是IServiceProvider
,最后给他return一个THostedService
就完事
相信大家都学会了委托这玩意,就一个花里胡哨的东西,但是用起来是真香,也显得自己逼格很高