如代码所示,匿名委托是Lambda表达式,不懂的同学就当它是有固定写法即可,不用讲什么道理,只要记住并应用即可。
匿名委托虽然减少了一点代码,但还是要求我们自己去声明委托。所有,还能再简写一点吗?
答案当然是,可以的。
Action与Func
Action与Func是微软为我们预先定义好了的,两个委托变量。其中Action是不带返回值的委托,Func是带返回值的委托。
可以说,Action与Func完全包含了,我们日常使用所需的,全部的,委托变量。
也就是说,我们可以不用再去自己手动声明委托了。
下面来看最简单的Action与Func的定义:
1
2
|
Action a1 = () => { }; Func< int > f1 = () => { return 1; }; //必须写 return 1; |
Action与Func是泛型委托,各支持16个入参变量。下面代码为一个入参的定义,多参数以此类推。
1
2
|
Action< int > a1 = (i) => { }; Func< string , int > f1 = (str) => { return 1; //必须写 return 1; }; |
委托的线程应用
委托的线程应用是委托的第二种用法,分为线程使用委托,和委托的异步应用两种。
我们先看线程使用委托。如下代码所示,一个无入参匿名Action和一个无入参匿名Func。
1
2
3
4
5
|
Task taskAction = new Task(() => { }); //无入参匿名Action taskAction.Start(); Task< int > taskFunc = new Task< int >(() => { return 1; }); //无入参匿名Func taskFunc.Start(); int result= taskFunc.GetAwaiter().GetResult(); //获取线程返回结果 |
我们能看到两种委托应用,代码都非常简洁。
下面我们再来看委托的异步应用。首先看最简单的异步调用。
1
2
3
4
5
6
7
8
9
10
|
Action action = new Action(() => { }); IAsyncResult result = action.BeginInvoke((iar) => { }, null ); Func< int > func = new Func< int >(() => { return 1; }); IAsyncResult resultfunc = func.BeginInvoke((iar) => { var res = func.EndInvoke(iar); }, null ); |
这里我们使用委托的BeginInvoke方法来开启线程,进行异步调用。如上面代码所示,这里介绍了Action与Func的最基础的异步应用。
委托,架构的血液
委托是架构的血液,如果系统中没有委托,那代码将堆叠到一起,比大力胶粘的都紧密。
就好比一碗汤面倒掉了所有的汤,只要它静放一个阵子,就会变成一坨面球,让你无从下嘴。
所以,委托是架构的血液,是框架的流畅的基石。
那么委托到底是如何流动的呢?
我们先从刚介绍过的委托的线程应用说起。
----------------------------------------------------------------------------------------------------
第一核心应用——随手线程:
我们在做开发的时候,一定接触过父类。父类是干什么的呢?父类通常是用来编写公共属性和函数,方便子类调用的。
那我们的委托的第一个核心应用,就是父类的公共函数,线程随手启动。如何随手开启呢?
首先,我们创建父类代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
class BaseDelegateSyntax { public void AsyncLoad(Action action) { } public void AsyncLoad(Action action, Action callback) { IAsyncResult result = action.BeginInvoke((iar) => { callback(); }, null ); } public void AsyncLoad<T>(Action<T> action, T para, Action callback) { IAsyncResult result = action.BeginInvoke(para, (iar) => { callback(); }, null ); } public void AsyncLoad<T, R>(Func<T, R> action, T para, Action<R> callback) { IAsyncResult result = action.BeginInvoke(para, (iar) => { var res = action.EndInvoke(iar); callback(res); }, null ); } } |