c#闭包(个人理解)

1.闭包:函数内的lamda表达式或者其他函数用到了函数内创建的变量,会将这个变量捕获(不会在函数执行完释放,看编译后的代码是将表达式编译成一个类,捕获的变量作为类的字段,委托实例作为类方法),捕获的变量的值是在表达式使用的时候拿值(也就是拿最新的值),所以会出现下面的情况:

static void Main(string[] args)
{
for (int i = 1; i <= 5; i++)
{
Task.Run(() => Console.WriteLine(i));
}

Console.ReadKey();
}

会输出55555而不是12345。

解决方法:

用foreach或者

for (int i = 1; i <= 5; i++)
{

int j = i
Task.Run(() => Console.WriteLine(j));
}

内存泄漏:由于被捕获的变量的生命周期被改变,会随着委托的销毁而销毁,所以每次用完闭包记得销毁。

2.建议:使用本地函数代替委托实例或者lamda表达式。

使用本地函数的好处是:

编译时匿名函数会将闭包编译成类,而本地函数会将闭包编译成结构体,结构体能够在方法跑完立即释放,不用等垃圾回收,并且不会创建委托实例,直接调用结构体的方法.

参考:(26条消息) C#_闭包_c# 闭包_heater404的博客-CSDN博客

 
posted @ 2022-07-11 18:39  mc宇少  阅读(545)  评论(0编辑  收藏  举报