zoukankan      html  css  js  c++  java
  • 委托、泛型委托、多播委托、匿名函数、lamda表达式、事件

    1、为什么要使用委托

      将一个方法作为参数传递给另一个方法

    2、委托概念

      public delegate int 委托名(int a, int b);

      声明一个委托类型,可以用访问修饰符修饰,delegate关键字,有返回值和参数

      委托所指向的函数必须跟委托具有相同的签名,即相同的参数个数,相同的参数类型和相同的返回值类型

    3、匿名函数

       没有名字的函数                         static int Add(int a, int b){return a + b; }
       =》匿名函数                             
    Expression add = delegate (int a, int b) { return a + b; }
       =》再简化(lambda表达式)    Calculate((a, b) => a + b, 10, 25);


            static void Calculate(Expression ex, int a, int b)
            {
                Console.WriteLine(ex(a, b) + " ");
            }

    4、泛型委托

      public delegate T 委托名<T>(T a, T b);

      微软已定义好一套泛型委托供我们使用,以免繁琐重复定义,它们分别是ActionFuncPredicate

      1). Action

        Action是无返回值的泛型委托

        Action表示无参,无返回值的委托

        Action<int,string> 表示有传入参数int,string无返回值的委托

        Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托

             Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托

          Action至少0个参数,至多16个参数,无返回值。

      2). Func

        Func是有返回值的泛型委托

          Func<int> 表示无参,返回值为int的委托

          Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

          Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托

          Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void

      3). Predicate

          Predicate 是返回bool型的泛型委托

       Predicate<int> 表示传入参数为int 返回bool的委托

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

    5、多播委托

      包含一个以上方法的引用,可以顺序执行多个方法

      包含的方法必须返回void,否则会抛出异常,之后所有的委托都不会执行

      可以使用GetInvocationList调用与委托直接相关的方法,捕获异常,并继续下一次迭代

       

      class Program
        {
            delegate void show(out int a);
            static void Main(string[] args)
            {
                int d;
                show s = show1;
                s += show2;
                s += show3;
                s += show4;
                Delegate[] list = s.GetInvocationList();
                foreach (show ds in list)
                {
                    try
                    {
                        ds(out d);
                    }
                    catch
                    {
                        Console.WriteLine("show2异常");
                    }
                }

                Console.Read();
            }
            static void show1(out int a)
            {
                a=1;
                Console.WriteLine(a);
            }
            static void show2(out int a)
            {
                a = 2;
                Console.WriteLine(a);
            }
            static void show3(out int a)
            {
                a = 3;
                Console.WriteLine(a);
            }
            static void show4(out int a)
            {
                a = 4;
                Console.WriteLine(a);
            }
        }

    6、lamda表达式

      本质还是匿名函数(参数=>返回条件

    7、事件

      http://www.cnblogs.com/ruanraun/p/shijian.html

  • 相关阅读:
    使用Silverlight 实现工作流流程定义
    中国国内航线信息的可视化
    笨办法学R编程(5)
    笨办法学R编程(4)
    笨办法学R编程(3)
    香山杯部分WP
    PWNABLE 3x17
    PWNABLE dubblesort
    PWNABLE applestore
    pyc文件修复出题经历
  • 原文地址:https://www.cnblogs.com/gc001279/p/8950898.html
Copyright © 2011-2022 走看看