一、基本简介
1、 Lambda
表达式主要用来创建匿名函数,使用=>来将参数和函数体分开。用来简化一些简单函数的使用,再结合委托即可以使C#
代码更加简洁。
2、 Lambda
表达式主要有两种形式,分别为:
- 表达式为主体的,表达式
Lambda
,形如:(param) => expression
- 语句块为主体的,语句
Lambda
,形如:(param) => { expression1; expression2; .... }
3、表达式Lambda
的主体只能为一个表达式,它会返回表达式的结果,且不可以有多条语句;而语句Lambda
的主体可以有多条语句,但一般语句过多的主体不会使用Lambda
表达式,而直接使用函数。
4、任何 Lambda
表达式都可以转换为委托类型。其中无返回值的常用于Action
委托,有返回值的常用于Func
委托。结合Lambda
表达式,委托的使用会更加简洁、方便。
int temp1 = 10;
string str = "Just Test!";
/*********转化为Action委托的Lambda***********/
//带一个参数的Action委托,使用语句块为主体,可包含多条语句
Action<int> ac01 = new Action<int>((num01) =>
{
str += " Thanks";
ChangeNum(num01);
});
ac01(20); //调用该委托
//无形参的Action委托,使用语句块为主体
Action ac02 = () => { ShowContent(); };
ac02();
//无形参的Action委托,使用表达式为主体
Action ac03 = () => ShowContent();
ac03();
/*********转化为Func委托的Lambda***********/
//Func委托,当形参只有一个时,形参的括号可有可无
Func<int,int> f01 = x1 => x1 + 100; // 只有一条语句,此时编译器会自动添加 return,以返回结果
Func<int, string> f02 = new Func<int, string>(x2 => "hello this is f02");
//Lambda表达式主体有多条语句,必须要显式使用大括号{}和 return 来返回结果,
Func<int, int, string> f03 = new Func<int, int, string>((int n1, int n2) =>
{
n1 *= 10;
n2 += n1;
return (n1 + n2).ToString();
});
private void ChangeNum(int num)
{
temp1 *= 10;
label02.Content = temp1 + num;
}
private void ShowContent()
{
str += " $$$****";
label03.Content = str;
}
二、 Lambda
表达式用于Async
和 Await
的异步编程
点击按钮触发事件,延迟1秒再触发事件。传统的方式:
public LambdaTest()
{
InitializeComponent();
Btn01.Click += OnBtnClicked;
}
private async void OnBtnClicked(object sender, RoutedEventArgs e)
{
await JustWait();
label04.Content = "Btn01 have been clicked.";
}
private async Task JustWait()
{
await Task.Delay(1000);
}
使用Lambda
表达式需要在参数列表前加async
关键字,简化后的方式如下:
public LambdaTest()
{
InitializeComponent();
Btn01.Click += async (sender, e) =>
{
await JustWait();
label04.Content = "show in Label";
};
}
private async Task JustWait()
{
await Task.Delay(1000);
}
【注:若不需要异步处理,则可以直接将async
和await
关键字去掉即可】
参考资料:
[1] Lambda 表达式