C#委托的介绍(delegate、Action、Func、predicate)

来源:互联网 发布:申请域名后缀 编辑:程序博客网 时间:2024/06/09 23:36

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。


============================================================================================

1、delegate(常用的一种声明,匿名方法)

Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。

public delegate void MyDelegate(string name);public class MyBlogBase{   private MyDelegate mydelegate;}
(1) 自定义Delegate时,我们常常发现Delegate必须全局可见,才能在其他地方可见并使用,而下面Action,Func的出现改变了这一局面,这两个其实说白了就是系统定义好的Delegate。

(2) 其实匿名方法,有个优点,就是可以直接使用当前函数出现的变量,代码更简洁,但可能有些人觉得不易读



============================================================================================

2、Action(无返回值的泛型委托)

(1) Action 默示无参,无返回值的委托
(2) Action<int,string> 默示有传入参数int,string无返回值的委托
(3) Action<int,string,bool> 默示有传入参数int,string,bool无返回值的委托
(4) Action<int,int,int,int> 默示有传入4个int型参数,无返回值的委托
Action至少0个参数,至多16个参数,无返回值。


Action<T>:封装一个方法,该方法只有一个参数并且不返回值。其中T是可接收的任何类型。使用代码如下:

public static void Main(){      Action<string> messageTarget;       //方法是实例化 Action<T> 委托,而不是显式定义一个新委托并将命名方法分配给该委托。      messageTarget = ShowWindowsMessage;      messageTarget("Hello, World1!");         // Action<T> 委托与匿名方法一起使用      messageTarget = delegate(string s) {ShowWindowsMessage(s); };      messageTarget("Hello, World2!");      //将 lambda 表达式分配给 Action<T> 委托实例      messageTarget = s => ShowWindowsMessage(s);       messageTarget("Hello, World3!");}      private static void ShowWindowsMessage(string message){      MessageBox.Show(message);      }


============================================================================================

3、Func(有返回值的泛型委托)
(1) Func<int> 默示无参,返回值为int的委托
(2) Func<object,string,int> 默示传入参数为object, string 返回值为int的委托
(3) Func<object,string,int> 默示传入参数为object, string 返回值为int的委托
(4) Func<T1,T2,,T3,int> 默示传入参数为T1,T2,,T3(泛型)返回值为int的委托
Func至少0个参数,至多16个参数,按照返回值泛型返回。


必须有返回值,不成void。

public static void Main(){      // 实例化 Func<T, TResult> 委托      Func<string, string> convertMethod = UppercaseString;      string name = "Dakota1";      Console.WriteLine(convertMethod(name));      //将 Func<T, TResult> 委托与匿名方法一起使用      Func<string, string> convert = delegate(string s)         { return UppercaseString(s);};       string name = "Dakota2";      Console.WriteLine(convert(name));      //将 lambda 表达式分配给 Func<T, TResult> 委托。      Func<string, string> convert = s => UppercaseString(s);      string name = "Dakota";      Console.WriteLine(convert(name));   }private static string UppercaseString(string inputString){      return inputString.ToUpper();}


============================================================================================

4、Predicate(返回bool型的泛型委托)

(1) predicate<int> 默示传入参数为int 返回bool的委托

Predicate有且只有一个参数,返回值固定为bool


Predicate<T>返回值为bool无重载,表示定义一组条件并确定指定对象是否符合这些条件的方法.此方法常在集合的查找中被用到,如:数组,正则拼配的结果集中被用到。使用此方法快捷方便,使用代码如下:

Predicate<int> myPredicate;        int[] myNum = new int[8] { 12, 33, 89, 21, 15, 29, 40, 52 };       public int[] myResult;        public MyBlogBase()        {            myPredicate = delegate(int curNum)             { if (curNum % 2 == 0) return true;               else return false;             };        }          public void StartPredicate()        {            myResult = Array.FindAll(myNum, myPredicate);        }
上例中说明了Predicate的使用,FindAll方法中,参数2即是一个Predicate,在具体的执行中,每一个数组的元素都会执行指定的方法,如果满足要求返回true,并会被存放在结果集中,不符合的则被剔除,最终返回的集合,即是结果判断后想要的集合,此方法应用场景感觉像迭代中的yield。


0 0
原创粉丝点击