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<string,int> action = new Action<string, int>((string name, int age) =>
{
Console.WriteLine(name);
Console.WriteLine(age);
});
action.Invoke("王五", 40);
}
{
// LambdaExpression 可以省略参数类型 这是编译器的语法糖
// 虽然没写 但编译时还是有的 类型是根据委托推算的
Action<string, int> action = new Action<string, int>(( name, age) =>
{
Console.WriteLine(name);
Console.WriteLine(age);
});
action.Invoke("王五", 40);
}
{
// lambda 当方法体只有一行时,可以去掉大括号
Action<string, int> action = new Action<string, int>((name, age) => Console.WriteLine(name + "我的年纪是" + age)
);
action.Invoke("王五", 40);
}
{
// 当参数只有1个时 可以省掉括号
Action<string> action = new Action<string>(name=>Console.WriteLine(name));
// 还可以
Action<string> 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表达式只是实例化委托的一个参数,就是个方法
表面上看是匿名方法,但是在编译时会自动分配一个方法名,还会增加一个私有的密封类,而这个方法就在密封类内。