淺析C#之委託、Action、Func

1、委託

1.1 委託的定義

delegate(委託)是一種可用於封裝命名方法或匿名方法的引用類型, 委託相似於 C++ 中的函數指針;
.Net經過委託來提供回調函數機制。函數

聲明一個委託類型
internal delegate void Feedback(Int32 value);this

一個簡單的實例spa

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);
        }
    }
}

運行結果:
.net

能夠看到委託的使用:用C#的delegate定義一個委託,用new操做符構造委託實例,最後用方法調用回調函數,執行成功指針

爲了使用方便,.net framework提供了委託的包裝類,Action和Func,是C#的語法糖。code

2、Action

Action是無返回值的委託,.net framework提供了17個Action委託,他們從無參到最多16個參數;
幾個簡單的例子:blog

2.1 無輸入參數無返回值的委託
Action action= () => { };input

2.2 一個輸入參數無返回值的委託
Action<int> ac = x => Console.WriteLine("this is {0}", x);回調函數

2.3 多個輸入參數的委託it

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);
       }

3、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;
};

4、小結

一、委託能夠理解爲方法的指針,指向一個方法;
二、Action和Func也是委託,是.net framework提供的包裝委託,常常和lambda表達式一塊兒使用;
三、當無返回值時,使用Action;當有返回值時,使用Func。
相關文章
相關標籤/搜索