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