闭包:函数内的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));
}
内存泄漏:由于被捕获的变量的生命周期被改变,会随着委托的销毁而销毁,所以每次用完闭包记得销毁。