Files

98 lines
3.2 KiB
C#
Raw Permalink Normal View History

2025-10-20 11:12:14 +08:00
namespace Lesson15_lambda表达式
{
class Program
{
static void Main(string[] args)
{
#region 知识点一 什么时lambda表达式
//可以将lambda表达式理解为 匿名函数的简写
//它除了写法不同外
//使用上和匿名函数是一样的
//都是配合委托类型使用的
#endregion
#region 知识点二 lambda表达式的语法
//匿名函数
//delegate(参数列表){函数体};
//lambda表达式
//(参数列表)=>{函数体};
#endregion
#region 知识点三 使用
//1.无参无返回值的lambda表达式
Action a = () =>
{
Console.WriteLine("无参无返回的lambda表达式函数");
};
a();
//2.有参无返回值的lambda表达式
Action<int> a2 = (int i1) =>
{
Console.WriteLine($"有参无返回的lambda表达式 参数i1:{i1}");
};
a2(100);
//3.有参的lambda表达式,甚至参数类型都可以省略 参数类型和委托或事件容器一致
Action<int> a3 = (i1) =>
{
Console.WriteLine($"有参无返回的lambda表达式 参数i1:{i1}");
};
a3(200);
//4.有返回值的lambda表达式
Func<int, int, int> f = (i1, i2) =>
{
Console.WriteLine($"有返回的lambda,将返回{i1}与{i2}相加");
return i1 + i2;
};
Console.WriteLine(f(10, 20));
#endregion
Test t = new Test();
t.Dosomething();
}
}
#region 知识点四 闭包
//内层的函数可以引用包含在它外层的变量
//即使外层函数已经执行完毕
//注意:
//该变量提供的值并不是变量创建时的值,而是在父函数范围内最后一次被修改的值
#endregion
class Test
{
public event Action action;
public Test()
{
int value = 10;
//这里就是一个闭包的例子
//因为 当构造函数执行完毕后 value变量的生命周期应该结束了
//但是由于action引用了value变量
//所以value变量的生命周期被延长了
action = () =>
{
Console.WriteLine($"闭包value的值为:{value}");
};
for (int i = 0; i < 10; i++)
{
int index = i;//解决闭包问题的常用方法
//每次都是新创建的index变量,所以可以保存当时的值
//但是i是在循环里的,所以每次循环都是同一个i变量,所以最终闭包引用的i变量的值就是循环结束时的值10
action += () =>
{
Console.WriteLine($"闭包循环i的值为:{i}");
Console.WriteLine($"闭包循环index的值为:{index}");
};
}
}
public void Dosomething()
{
action();
}
}
}