一、委托
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;
};