Action,func,委托相关的理解以及task的使用

1,他们是什么:

Action 封装一个方法,该方法不具有参数并且不返回值。

Action<> 封装一个方法,该方法具有最多16个参数并且不返回值。

func<> 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。最多可以传递16个参数,并且可以有返回值,最后一个参数是返回值

目前了解到的好像也只有委托是需要传递一个方法的,既然这里的三个方式都是封装一个方法,那么这种写法就肯定是可以用到给委托传递参数一类型的任务时用,想想刚开始学习委托的时候,要给他传递一个方法,还要再写一个方法去传递,再把方法名传递过去,代码组织能力差点的可能写出来的云里雾里,会很混乱。那么有这些结构做一个中间层,所有问题都得到很好的解决,结构也不乱了,学习成本也低了。那么他们究竟是什么,我仔细思考过这个问题,现在我的理解就是他们都是委托的一种表达方式,就像事件一样,这样理解所有的疑惑就都解开了。可以传递方法,可以返回值也可以不返回值 这可不就是委托嘛.

2.怎么用:

        Action<string> astr = new Action<string>((x) =>
        {
            Console.WriteLine("Action<>" + x);
        });
        astr.Invoke("Action<>");

        Action a = new Action(() =>
        {
            Console.WriteLine("Action");
        });
        a.Invoke();

        Func<string, string> func = new Func<string, string>((x) =>
        {
            return x;
        });
        string funcTest = func.Invoke("123");
        Console.WriteLine("Func<>" + funcTest);

复制代码
3,用在什么地方:

通过对这些东西的了解最直接的结果就是终于对一些方法的参数不再迷茫了. 最典型 lambda表达式中的那种写法,实际上就是Func<>这个东西,看方法签名一目了然。然后就是可以将Func<>作为方法的参数,这样的话,就可以把被调用方的具体的一部分操作权交给调用方来执行。

public static IEnumerable Where(this IEnumerable source, Func<TSource, bool> predicate);像这样的,知道里边的原理,再使用,就不会迷糊,很清晰的感觉。

Func<int,int,int> math=delegate(int param1,int param2)
{
  Return param1+param2;
}
Lambda:
Func<int,int,int> math=(param1,param2)=>
{
  Return param1+param2;
}

另外 加上 task的用法

 private void button1_Click(object sender, EventArgs e)
    {
        Step1();//第一步,因为你现在还在UI线程,所以会阻塞,然而这里的阻塞只是模拟你进行的操作
        Task taskForStep2 = new Task(() => Step2());
        taskForStep2.ContinueWith(task1 => Step3());
        taskForStep2.Start();
        //第二步进入了多线程,所以不阻塞了
        //第三步在第二步执行完后执行,同样是多线程,不阻塞
    }


    public void Step1()
    {
        Thread.Sleep(5000);//模拟你进行的操作
        this.BeginInvoke(new Action(() => label1.Text = "Step1"));//模拟你进行的UI操作
    }
    public void Step2()
    {
        Thread.Sleep(5000);
        this.BeginInvoke(new Action(() => label1.Text = "Step2"));
    }
    public void Step3()
    {
        Thread.Sleep(5000);
        this.BeginInvoke(new Action(() => label1.Text = "Step3"));
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值