委托泛型委托多播委托匿名函数lamda表达式事件

Posted 竹林逸雪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了委托泛型委托多播委托匿名函数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) + "\\n");
        }

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

以上是关于委托泛型委托多播委托匿名函数lamda表达式事件的主要内容,如果未能解决你的问题,请参考以下文章

(23)c#传智:单例模式,XML读写,委托,匿名函数,Lamda,多播委托

C#委托,匿名方法,Lambda,泛型委托,表达式树代码示例

unity的C#学习——委托事件和匿名方法

#yyds干货盘点#愚公系列2023年02月 .NET/C#知识点-委托匿名方法Lambda泛型委托表达式树的进化史

C#复习总结细说泛型委托

.net 中 委托的解析泛型解析可变性解析表达式和匿名方法基invoke的用法()