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博客