浅析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#之委托、Action、Func

可以看到委托的使用:用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。
上一篇:OC工程调用Swift方法


下一篇:python中__str__与__repr__