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