C# 闭包

今天在写代码的时候,突然发现奇怪的问题,调试之后,才发现是函数闭包使用错误,踩坑了。于是记录下来。

存在闭包就等同于存在数据共享,共享数据的存在往往容易引起不预期的结果;存在共享就要警惕线程安全问题,尽量避免闭包在多线程环境的使用,应该使用更为明确函数定义

原来的代码如下

复制代码
for (int i = 0; i < slotNumber; i++)
{
    _locationWafers[module][i] = new WaferInfo();
    DATA.Register($"System.WaferInfo", $"{module.ToString()}.Slot{i + 1:D2}", () => GetWafer(module, i), DataAttribute.DataFlag.NonPersist);
}

这里面lamada 函数是一个闭包, 闭包执行的时候,i 值已经变化了。所以,得不到最后想要的结果。于是我改成了下面的。将i 复制成新的变量。

复制代码
for (int i = 0; i < slotNumber; i++)
{
    int slot= i;
    _locationWafers[module][i] = new WaferInfo();
    DATA.Register($"System.WaferInfo", $"{module.ToString()}.Slot{slot + 1:D2}", () => GetWafer(module, slot), DataAttribute.DataFlag.NonPersist);
}

总之,尽量少用闭包吧

相关推荐
子兮曰3 小时前
async/await高级模式:async迭代器、错误边界与并发控制
前端·javascript·github
oak隔壁找我3 小时前
JVM常用调优参数
java·后端
恋猫de小郭3 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
GIS之路5 小时前
ArcGIS Pro 中的 Notebooks 入门
前端
IT_陈寒7 小时前
React状态管理终极对决:Redux vs Context API谁更胜一筹?
前端·人工智能·后端
晨星shine7 小时前
GC、Dispose、Unmanaged Resource 和 Managed Resource
后端·c#
蝎子莱莱爱打怪7 小时前
OpenClaw 从零配置指南:接入飞书 + 常用命令 + 原理图解
java·后端·ai编程
Kagol8 小时前
TinyVue 支持 Skills 啦!现在你可以让 AI 使用 TinyVue 组件搭建项目
前端·agent·ai编程
柳杉8 小时前
从零打造 AI 全球趋势监测大屏
前端·javascript·aigc
simple_lau8 小时前
Cursor配置MasterGo MCP:一键读取设计稿生成高还原度前端代码
前端·javascript·vue.js