目录
1.Lambda表达式
Lambda表达式的起源:源自匿名方法。可以把Lambda理解为一个匿名方法,它可以包含表达式和语句,并且创建委托或转换为表达式树。
Lambda表达式的意义:足够简洁,方便程序员后期更好的看清程序结构、以及方便后期维护。
Lambda表达式的定义:在使用Lambda表达式时,都会使用"=>"运算符(读作"goes to")。该运算符的左边是匿名方法的输入参数,右边是表达式或语句块。
Lambda表达式的演变史:(下面的Func委托是代表有返回类型的委托)
class Program
{
static void Main(string[] args)
{
//C#1.0 创建委托实例(需要回调方法)
Func<string,int> test1 = new Func<string,int>(Callback);
//C#2.0 用匿名方法创建(不需要回调方法)
Func<string,int> test2 = callbackMethod
{
return str1.length;
};
//C#3.0 使用Lambda表达式创建
//第1种
Func<string,int> text3 = (string str1) => str1.length;
//第2种
Func<string,int> text4 = (str1) => str1.length;
//第3种
Func<string,int> text5 = str1 => str1.length;
//调用委托
Console.WriteLine("使用Lanmbda表达式返回字符串的长度:"+text5("123"));
}
void Callback(string str1)
{
return str1.length;
}
}
1.1 创建委托
Lambda表达式的使用:
using System;
using System.Window.Forms;
class Program
{
static viod Main(string[] args)
{
//创建实例
Button button1=new Button();
//Lambda表达式
button1.Click +=(sender,e) => CallbackEvent("点击事件",sender,e);
button1.KeyRress +=(sender,e) => CallbackEvent("键盘按下事件",sender,e);
//对象初始器
Form form = new Form{Name="",AutoSize=true,Controls={button1}};
//运行窗体
Application.Run(form);
}
//事件的回调方法
static void CallbackEvent(string title,object sender,EventArgs e)
{
Console.Writeline("发生的事件是{0}",title);
Console.Writeline("发生的事件的对象是{0}",sender);
Console.Writeline("发生的事件参数是{0}",e.GetType());
}
}
1.2 表达式树(表达式目录树)
表达式树的定义:用来表示Lambda表达式逻辑的一种树形的数据结构,它将代码表示成一个对象树,而非可执行的代码。
动态构造一个表达式树:
using System;
//引入Expression<TDelegate>类的命名空间
using System.Linq.Expression;
class Program
{
static void Main(string[] args)
{
//表达式参数
ParameterExpression a = Expression.Parameter(typeof(int),"a");
ParameterExpression b = Expression.Parameter(typeof(int),"b");
//表达式树的主体部分
BinaryExpression be = Expression.Add(a,b);
//构造表达式树
Expression<Func<int,int,int>> expressionTree = Expression.Lambda<Func<int,int,int>>(be,a,b);
//分析树结构,获取表达式树的主体
BinaryExpression body = (ParameterExpression)body.Body;
//左节点,每个节点本身是一个表达式对象
BinaryExpression left = (ParameterExpression)body.Left;
//右节点
BinaryExpression right = (ParameterExpression)body.Right;
//输出表达式树结构
Console.WriteLine("表达式树的结构为{0}",expressionTree);
}
}
//output:
//<a,b>=><a+b>
通过Lambda表达式构造表达式树:
using System;
//引入Expression<TDelegate>类的命名空间
using System.Linq.Expression;
class Program
{
static void Main(string[] args)
{
//构造表达式树
Expression<Func<int,int,int>> expressionTree = (a.b) =>a+b;
//分析树结构,获取表达式树的主体
BinaryExpression body = (ParameterExpression)body.Body;
//左节点,每个节点本身是一个表达式对象
BinaryExpression left = (ParameterExpression)body.Left;
//右节点
BinaryExpression right = (ParameterExpression)body.Right;
//输出表达式树结构
Console.WriteLine("表达式树的结构为{0}",expressionTree);
}
}
//output:
//<a,b>=><a+b>
把表达式树转换成可执行的代码:
using System;
//引入Expression<TDelegate>类的命名空间
using System.Linq.Expression;
class Program
{
static void Main(string[] args)
{
//构造表达式树
Expression<Func<int,int,int>> expressionTree = (a.b) =>a+b;
//分析树结构,获取表达式树的主体
BinaryExpression body = (ParameterExpression)body.Body;
//通过Compile方法来生成Lambda表达式的委托
Func<int,int,int> delinstance = expressionTree.Compile();
int result = delinstance(2,3);
Console.WriteLine("和为{0}",result);
}
}
//output:
//<a,b>=><a+b>