C# -委托、泛型委托、匿名方法、Lambda表达式

前言

   这几天一直在回顾之前的知识,不是常用的都已经忘记了,俗话说得好,书到用时方恨少。之前对于委托一直都是云里雾里的,在此总结一下,以便日后查看!

委托

  • 委托(delegate):委托是一种数据类型,像类一样,可以声明委托类型的变量,它可以将方法当做另一个方法来进行传递。
  • 委托(delegate)至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。

实例

namespace 委托
{
    class Program
    {
        static void Main(string[] args)
        {
            MyDelegate md = new MyDelegate(M1);

            //调用md委托的时候就相当于调用的M1方法
            md();
            Console.ReadLine();
        }
        static void M1()
        {
            Console.WriteLine("我是一个没有返回值没有参数的方法");
        }
    }
    //定义了一个名字叫MyDelegate的类型,并且这个类型是个委托,而且只能存储没有返回值,没有参数的方法
    public delegate void MyDelegate();
}

在这里插入图片描述
很好理解的一个实例,当然委托的用处不仅于此!

匿名方法

匿名方法:不能直接在类中定义,而是在给委托变量赋值的时候,需要赋值一个方法,此时可以“现做现卖”,定义一个匿名方法传给委托。这个匿名方法我们要熟悉他的语法,后面我会介绍lambda表达式。

实例

namespace 匿名方法
{
    class Program
    {
        static void Main(string[] args)
        {
            Mydelegate md = delegate ()
              {
                  Console.WriteLine("我是一个现做现卖的匿名方法");
              };
            md();
            Console.Read();
        }
    }
    public delegate void Mydelegate();
}

在这里插入图片描述

lambda表达式

lambda表达式就是对匿名方法的一个升级,变得更方便了,语法如下。

namespace 匿名函数
{
    class Program
    {
        static void Main(string[] args)
        {
            //无参数用小括号代表
            MyDelegate md = () => { Console.WriteLine("lambda表达式!"); };

            //有参数直接传参数,不用传递数据类型,委托已经限定数据类型
            MyDelegate1 md1 = m => { Console.WriteLine(m); };
            md();
            md1("大家好");
            Console.ReadLine();
        } 
    }
    //有参数的委托
    delegate void MyDelegate1(string msg);
    
    //无参数的委托
    delegate void MyDelegate();
}

在这里插入图片描述

泛型委托

说到泛型委托,首先要明白为什么要有泛型委托,如果我们有三个方法,这三个方法的参数的数据类型都不同。这时我们就要定义三个委托,程序猿是聪明的,泛型委托解决了这一问题。

实例

namespace 泛型委托
{
    class Program
    {
        static void Main(string[] args)
        {            
            //泛型委托
            MyGenericDelegate<string> md = M1;
            md("我是参数为string类型的方法");
            MyGenericDelegate< int > md1 = M1;
            md1(250);
            Console.Read();
        }
        static void M1(int j)
        {
            Console.WriteLine(j);
        }
        static void M1(string msg)
        {
            Console.WriteLine(msg);
        }
    }
    //泛型委托
    public delegate void MyGenericDelegate<T>(T args);
}

微软也是很爱程序猿的,编译器自带了一个泛型的委托Action,它有16个重载,用起来非常的方便**

namespace 泛型委托
{
    class Program
    {
        static void Main(string[] args)
        {
            
            Action action1 = new Action(M1);
            action1();

            Action<string> al = M1;
            al("我是参数为string类型的方法");

            Action<int> al1 = M1;
            al1(250);
      
        }
        static void M1()
        {
            Console.WriteLine("我是一个无参数的方法");
        }
        static void M1(int j)
        {
            Console.WriteLine(j);
        }
        static void M1(string msg)
        {
            Console.WriteLine(msg);
        }
    }
}

在这里插入图片描述
说到这里,可能会有大佬想到这些都是无返回值的,如果我的方法是有返回值的怎么办,这时候不要慌,我都说了微软是爱程序猿的,Func解决了这个问题,和Action的使用方式一样它只是带返回值的。

namespace 泛型委托
{
    class Program
    {
        static void Main(string[] args)
        {
             //第四个int表示返回值的数据类型
            Func<int, int, int, int> fun =(M1);
            int result= fun(1, 2, 4);
            Console.WriteLine(result);
            Console.Read();
        }
        static int M1(int n1, int n2, int n3)
        {
            return n1 + n2 + n3;
        }
    }
}

在这里插入图片描述

总结

委托真的好强大,以后也会经常遇到,希望这篇博客对您有帮助。做了固然重要,知道为什么要这样做更重要。如有大佬发现问题,我们一起交流学习!

猜你喜欢

转载自blog.csdn.net/ywq1016243402/article/details/85041211