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博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了