浅析C#之委托、Action、Func

一、委托

1.1 委托的定义

delegate(委托)是一种可用于封装命名方法或匿名方法的引用类型, 委托类似于 C++ 中的函数指针;
.Net通过委托来提供回调函数机制。

声明一个委托类型
internal delegate void Feedback(Int32 value);

一个简单的实例

namespace CLRExer.Delegates
{
    //委托定义
    public delegate void FeedBack(int input);

    public class SimpleDelegateDemo
    {
        public void Excute()
        {
            FeedBack fb = new FeedBack(DoNothing);
            fb(1);
            //fb.Invoke(1);
        }

        /// <summary>
        /// 被调用的方法
        /// </summary>
        /// <param name="input"></param>
        private void DoNothing(int input)
        {
            Console.WriteLine("input is {0};", input);
        }
    }
}

运行结果:

可以看到委托的使用:用C#的delegate定义一个委托,用new操作符构造委托实例,最后用方法调用回调函数,执行成功

为了使用方便,.net framework提供了委托的包装类,Action和Func,是C#的语法糖。

二、Action

Action是无返回值的委托,.net framework提供了17个Action委托,他们从无参到最多16个参数;
几个简单的例子:

2.1 无输入参数无返回值的委托
Action action= () => { };

2.2 一个输入参数无返回值的委托
Action<int> ac = x => Console.WriteLine("this is {0}", x);

2.3 多个输入参数的委托

     Action<int, int, int> action2= InputDemo;
     action2(1, 2, 3);
     private void InputDemo(int input1, int input2, int input3)
       {
           Console.WriteLine("this is input1:{0},this is input2:{1},this is input3:{2}", input1, input2, input3);
       }

三、Func

Func是有返回值的委托,.net framework同样提供了17个Func委托,他们从无参到最多16个参数;
3.1 无输入参数,有一个返回值的委托
Func<long> func1 = () => { return 1; };

3.2 一个输入参数,有一个返回值的委托

//表示一个输入参数n,一个返回值sum
Func<long, long> func2 = n => {
    Int64 sum = 0;
    for (; n > 0; n--) {
        checked {
            sum += n;
        }
    }
    return sum;
};

四、小结

1、委托可以理解为方法的指针,指向一个方法;
2、Action和Func也是委托,是.net framework提供的包装委托,经常和lambda表达式一起使用;
3、当无返回值时,使用Action;当有返回值时,使用Func。
原文地址:https://www.cnblogs.com/zqllove/p/8617482.html