asp.net中C#委托的简单介绍

作者:袖梨 2022-06-25

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

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

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

Func,Action,Predicate全面解析

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

(1) *delegate TResult Func();
(2)*delegate TResult Func(T1 arg1);
(3) *delegate TResult Func(T1 arg1, T2 arg2);
(4)*delegate TResult Func(T1 arg1, T2 arg2, T3 arg3);
(5)*delegate TResult FuncT1 arg1, T2 arg2, T3 arg3, T4 arg4);
其中(1)只能委托无参但是有返回值的函数,TResult就是其返回类型。

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

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

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

 代码如下 复制代码
#region Func委托
 
///Func的用法
///这里TResult代表函数的返回值类型
///只能代理返回值为TResult类型的无参函数
Func func = delegate()
{
    return "我是Func委托出来的结果";
};
Console.WriteLine(func());
Console.ReadKey();
///Func的用法
///这里的T为代理的函数的传入类型,TResult代表函数的返回值类型
///只能代理参数为T类型,返回值为TResult类型的函数
Func funcOne = delegate(string s)
{
    return s.ToUpper();
};
Console.WriteLine(funcOne("我是Func委托出来的结果"));
Console.ReadKey();
///Func的用法
///这里T1,T2为代理的函数的传入类型,TResult代表函数的返回值类型
///只能代理参数为T1,T2类型,返回值为TResult类型的函数
Func funcTwo = delegate(string value1, string value2)
{
    return value1 + " " + value2;
};
Console.WriteLine(funcTwo("我是", "Func委托出来的结果"));
Console.ReadKey();
#endregion

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

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

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

(1) * delegate void Action(); 无参,无返回值
  (2)* delegate void Action(T1 arg1);
(3)* delegate void Action(T1 arg1, T2 arg2);
(4)* delegate void ActionT1 arg1, T2 arg2, T3 arg3);
(5)* delegate void ActionT1 arg1, T2 arg2, T3 arg3, T4 arg4);
从上面可以看出,总共有5中表现形式,其中(1)既没有传入参数,也没有返回值,那么它适合代理那些无参,无返回值的函数;(2)有一个传入参数,无返回值,适合代理有参,无返回值的函数,(3)(4)(5)以此类推。最都容纳四个传入参数。

那么如何使用呢?下面有一些简单的例子:

 代码如下 复制代码

#region Action的用法
///Action的用法
///这里的T为代理函数的传入类型,无返回值
Action action = delegate(string[] x)
{
    var result = from p in x
     where p.Contains("s")
     select p;
    foreach (string s in result.ToList())
    {
        Console.WriteLine(s);
    }
};
string[] str={ "charlies","nancy","alex","jimmy","selina"};
action(str);
Console.ReadKey();
#endregion

上面的例子是通过传入的String类型的数组,找出其中包含有字符s的项,然后输出到控制台。

最后一个就是Predicate委托,这个的形式比较少一些,就是一个传入参数,返回值为bool类型,具体示例如下:

 代码如下 复制代码
#region Predicate
          ///bool Predicate的用法
///输入一个T类型的参数,返回值为bool类型
Predicate predicate = delegate(string[] x)
{
    var result = from p in x
     where p.Contains("s")
     select p;
    if (result.ToList().Count > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
};
string[] _value = { "charlies", "nancy", "alex", "jimmy", "selina" };
if (predicate(_value))
{
    Console.WriteLine("They contain.");
}
else
{
    Console.WriteLine("They don't contain.");
}
Console.ReadKey();
#endregion

上面的代码其实也是判断String数组中有没有包含s的项,有的话就在控制台打印出  They contain.没有的话就打印出They don't contain.

总结一下这三个的特点就是:

Func可以接受0个至4个传入参数,必须具有返回值

Action可以接受0个至4个传入参数,无返回值

Predicate只能接受一个传入参数,返回值为bool类型

 代码如下 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateIntegrateConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
#region Func委托
 
///Func的用法
///这里TResult代表函数的返回值类型
///只能代理返回值为TResult类型的无参函数
Func func = delegate()
{
    return "我是Func委托出来的结果";
};
Console.WriteLine(func());
Console.ReadKey();
///Func的用法
///这里的T为代理的函数的传入类型,TResult代表函数的返回值类型
///只能代理参数为T类型,返回值为TResult类型的函数
Func funcOne = delegate(string s)
{
    return s.ToUpper();
};
Console.WriteLine(funcOne("我是Func委托出来的结果"));
Console.ReadKey();
///Func的用法
///这里T1,T2为代理的函数的传入类型,TResult代表函数的返回值类型
///只能代理参数为T1,T2类型,返回值为TResult类型的函数
Func funcTwo = delegate(string value1, string value2)
{
    return value1 + " " + value2;
};
Console.WriteLine(funcTwo("我是", "Func委托出来的结果"));
Console.ReadKey();
/*************余下的类似上面的这种操作,最多可以接受四个传入参数***************
 *delegate TResult Func(); 
 *delegate TResult Func(T1 arg1);
 *delegate TResult Func(T1 arg1, T2 arg2);
 *delegate TResult Func(T1 arg1, T2 arg2, T3 arg3);
 *delegate TResult FuncT1 arg1, T2 arg2, T3 arg3, T4 arg4);
 */
#endregion
#region Action的用法
///Action的用法
///这里的T为代理函数的传入类型,无返回值
Action action = delegate(string[] x)
{
    var result = from p in x
     where p.Contains("s")
     select p;
    foreach (string s in result.ToList())
    {
        Console.WriteLine(s);
    }
};
string[] str={ "charlies","nancy","alex","jimmy","selina"};
action(str);
Console.ReadKey();
/***************余下的类似上面的这种操作,最多可以接受四个传入参数**********
 * delegate void Action(); 无参,无返回值
 * delegate void Action(T1 arg1);
 * delegate void Action(T1 arg1, T2 arg2);
 * delegate void ActionT1 arg1, T2 arg2, T3 arg3);
 * delegate void ActionT1 arg1, T2 arg2, T3 arg3, T4 arg4);
 */
#endregion
#region Predicate
///bool Predicate的用法
///输入一个T类型的参数,返回值为bool类型
Predicate predicate = delegate(string[] x)
{
    var result = from p in x
     where p.Contains("s")
     select p;
    if (result.ToList().Count > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
};
string[] _value = { "charlies", "nancy", "alex", "jimmy", "selina" };
if (predicate(_value))
{
    Console.WriteLine("They contain.");
}
else
{
    Console.WriteLine("They don't contain.");
}
Console.ReadKey();
#endregion
        }
    }
}

相关文章

精彩推荐