浅谈C#中常见的委托Func,Action,Predicate(转)

时间:2021-07-30 17:41:03

一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的。

关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微,尤其是张子阳的那一篇。我就不用多废话了。

今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景。

Func,Action,Predicate全面解析

首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如下的5种类型:

(1) *delegate TResult Func<TResult>();

(2)*delegate TResult Func<T1,TResult>(T1 arg1);

(3) *delegate TResult Func<T1,T2,TResult>(T1 arg1, T2 arg2);

(4)*delegate TResult Func<T1,T2,T3,TResult>(T1 arg1, T2 arg2, T3 arg3);

(5)*delegate TResult Func<T1,T2,T3,T4,TResult>T1 arg1, T2 arg2, T3 arg3, T4 arg4);

其中(1)只能委托无参但是有返回值的函数,TResult就是其返回类型。

而(2)只能委托具有一个传入参数,有返回值的函数,T1为一个传入参数,TResult为返回类型。

(3)只能委托具有二个传入参数,有返回值的函数,T1和T2为两个传入参数,TResult为返回类型,(4)和(5)以此类推。

那么如何来使用呢? 下面给出一个简单的几个例子:

#region Func委托

///Func<TResult>的用法
///这里TResult代表函数的返回值类型
///只能代理返回值为TResult类型的无参函数
Func<string> func = delegate()
{
return "我是Func<TResult>委托出来的结果";
};
Console.WriteLine(func());
Console.ReadKey();

///Func<T,TResult>的用法
///这里的T为代理的函数的传入类型,TResult代表函数的返回值类型
///只能代理参数为T类型,返回值为TResult类型的函数
Func<string, string> funcOne = delegate(string s)
{
return s.ToUpper();
};
Console.WriteLine(funcOne("我是Func<T,TResult>委托出来的结果"));
Console.ReadKey();

///Func<T1,T2,TResult>的用法
///这里T1,T2为代理的函数的传入类型,TResult代表函数的返回值类型
///只能代理参数为T1,T2类型,返回值为TResult类型的函数
Func<string, string, string> funcTwo = delegate(string value1, string value2)
{
return value1 + " " + value2;
};
Console.WriteLine(funcTwo("我是", "Func<T1,T2,TResult>委托出来的结果"));
Console.ReadKey();

#endregion

上面代码中,我用了匿名方法来代替函数,其中delegate()代表无参函数,delegate(string s)代表有一个传入参数的函数,以下的以此类推。

然后需要说明的就是Action委托,这个委托也是非常常用的,尤其是在涉及到线程和界面交互的时候,配合着lamada表达式使用,非常方便的实现二者的交互。后面我会提到用法。

来看看Action委托的几种表现形式:

(1) * delegate void Action(); 无参,无返回值

(2)* delegate void Action<T>(T1 arg1);

(3)* delegate void Action<T1,T2>(T1 arg1, T2 arg2);

(4)* delegate void Action<T1,T2,T3>T1 arg1, T2 arg2, T3 arg3);

(5)* delegate void Action<T1,T2,T3,T4>T1 arg1, T2 arg2, T3 arg3, T4 arg4);