VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • C#语法--委托,架构的血液(2)

如代码所示,匿名委托是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);
    }
}

相关教程