【C#】委托中方法的简写演进

一、前提知识

  委托、事件、匿名函数、Lambda、系统自带委托Func和Action

1、委托:

可以理解为方法的一个引用(代理),调用委托就相当于调用了方法;它实现了方法的解耦;一个委托实例可以绑定多个方法,通过+=来操作

//定义委托
delegate 返回类型 委托名字Delegate(参数列表);
//如果委托是为了配合定义事件,命名如下
delegate 返回类型 事件名EventHandler(参数列表);

2、事件:

就是一个安全的委托,它的定义就是在委托的前面加event;为啥说事件是安全的委托,因为基本上事件的定义和调用都放在同一个类中

event 事件对应的委托 事件名 

3、匿名函数:

没有名字的函数,主要配合委托和事件进行使用

//定义
delegate
(参数列表){ //逻辑代码 }

 4、Lambda表达式

  它也是匿名函数,Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。

//无参一行逻辑的Lambda表达式
()=>Console.WriteLine("This is a Lambda expression.");

//无参一行逻辑的Lambda表达式
(a,b)=>{
     Console.WriteLine(a);
     Console.WriteLine(b);
};

5、Action

action是系统自带的没有返回值的泛型委托,它的方法参数默认最大16个

 

6、Func

func是系统定义的带返回值的泛型委托,它的方法参数默认最大也是支持16个,最有一个参数默认是返回参数

二、委托的写法演进

1、码代码

创建一个新类,名字随便取,测试代码如下

//定义委托
    delegate void StudentDelegate(string name, int age);
    public class LambdaTest
    {
        public void Show()
        {
             
            //历史
            //版本1
            {
                StudentDelegate studentDelegate = new StudentDelegate(StudentDelegateHandler);
                studentDelegate.Invoke("bill",20);
            }

            //版本2 (这样写的好处,可以访问当前方法里面的局部变量)
            {
                string dt = DateTime.Now.ToString();
                StudentDelegate studentDelegate = new StudentDelegate(
                    delegate (string name, int age)
                    {
                        Console.WriteLine($"当前时间是:{dt}");
                        Console.WriteLine($"我的名字是:{name},我的年龄是:{age}");
                    }
                );
                studentDelegate.Invoke("bill", 20);
            }

            //版本3 (=>  念成goes to)
            {
                string dt = DateTime.Now.ToString();
                StudentDelegate studentDelegate = new StudentDelegate(
                    (string name, int age)=>
                    {
                        Console.WriteLine($"当前时间是:{dt}");
                        Console.WriteLine($"我的名字是:{name},我的年龄是:{age}");
                    }
                );
                studentDelegate.Invoke("bill", 20);
            }

            //版本4
            {
                Action action = () => Console.WriteLine("Action无返回值,无参数的Lambda表达式方法");
                Action<DateTime> action1 = d => { Console.WriteLine(d+ "Action带一个参数"); };

                //带返回值的示例
                Func<DateTime> func = () => { return DateTime.Now; };    //这个写法和下面的写法  是等价的
                Func<DateTime> func1 =() => DateTime.Now; 

                //带输入参数,带返回值的示例
                Func<String, DateTime> func2 = (a) => {
                    Console.WriteLine(a + "Func带一个参数,带返回值的");
                    return DateTime.Now;
                };

                action();
                action1(DateTime.Now);
                DateTime result = func1();
                Console.WriteLine("Func只带返回值的写法,返回值是" +  result);

                DateTime result2 = func2("输入参数a");
            }
        }

        public void StudentDelegateHandler(string name, int age)
        {
            Console.WriteLine($"我的名字是:{name},我的年龄是:{age}");
        }
    }

2、测试和调用

static void Main(string[] args)
{
        LambdaTest lambdaTest = new LambdaTest();
        lambdaTest.Show();

        Console.ReadKey();
}

 

posted @ 2022-08-26 10:27  狼窝窝  阅读(237)  评论(0)    收藏  举报