Lambda表达式的演变

1 lambda的演变

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MyDelegate
{
    public delegate void NoReturnNoParameter();  // 1 声明委托
    public delegate void NoReturnWithParameter(string name, int age);  // 1 声明委托

    public class DelegateStudy
    {
        public void Show()
        {

            //lambda演变历史
            // .NetFramework 1.0 时代
            {
                NoReturnWithParameter method = new NoReturnWithParameter(this.DoEverything);
                method.Invoke("张三", 19);
            }
            {
                // .NetFramework 2.0 匿名方法.delegate 关键字
                // 可以访问局部变量
                NoReturnWithParameter method = new NoReturnWithParameter(delegate(string name, int age)
                {
                    Console.WriteLine(name);
                    Console.WriteLine(age);
                });
                method.Invoke("李四", 20);
            }
            {
                // .NetFramework 3.0  去掉delegate 增加了一个 =>
                // lambda 表达式  参数列表=>方法体
                NoReturnWithParameter method = new NoReturnWithParameter( (string name, int age)=>
                {
                    Console.WriteLine(name);
                    Console.WriteLine(age);
                });
                method.Invoke("李四", 20);
                // 也可以这样
                Action action = new Action((string name, int age) =>
                {
                    Console.WriteLine(name);
                    Console.WriteLine(age);
                });
                action.Invoke("王五", 40);
            }
            {
                // LambdaExpression 可以省略参数类型 这是编译器的语法糖
                // 虽然没写 但编译时还是有的  类型是根据委托推算的
                Action action = new Action(( name,  age) =>
                {
                    Console.WriteLine(name);
                    Console.WriteLine(age);
                });
                action.Invoke("王五", 40);
            }
            {
                // lambda 当方法体只有一行时,可以去掉大括号  
                Action action = new Action((name, age) => Console.WriteLine(name + "我的年纪是" + age)
                );
                action.Invoke("王五", 40);
            }
            {
                // 当参数只有1个时 可以省掉括号
                Action action = new Action(name=>Console.WriteLine(name));
                // 还可以 
                Action action2 = name => Console.WriteLine(name);//这是语法糖
            }
        }
        public void DoSomething()
        {
            Console.WriteLine("DoSomething");
        }
        public void DoEverything(string name, int age)
        {
            Console.WriteLine(name);
            Console.WriteLine(age);
        }
        public void DoAction(Action action)
        {
            action.Invoke();
        }

    }
}

2 lambda表达式的本质

        lambda表达式只是实例化委托的一个参数,就是个方法

        表面上看是匿名方法,但是在编译时会自动分配一个方法名,还会增加一个私有的密封类,而这个方法就在密封类内。

你可能感兴趣的:(.Net,Core)