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);
}

总之,尽量少用闭包吧

相关推荐
南方kenny1 分钟前
TypeScript + React:让前端开发更可靠的黄金组合
前端·react.js·typescript
小毛驴8504 分钟前
IntelliJ IDEA 的常用快捷键
java·ide·intellij-idea
Cache技术分享4 分钟前
149. Java Lambda 表达式 - Lambda 表达式的序列化
前端·后端
R-G-B8 分钟前
【05】VM二次开发——模块参数配置--带渲染/不带渲染(WinForm界面调用 模块参数配置)
c#·vm二次开发·vm模块参数配置·vm在winform界面调用
搜狐技术产品小编202310 分钟前
浅析责任链模式在视频审核场景中的应用
java·开发语言·责任链模式
LaoZhangAI16 分钟前
GPT-5推理能力全解析:o3架构、链式思考与2025年8月发布
前端·后端
JuneXcy32 分钟前
11.Layout-Pinia优化重复请求
前端·javascript·css
泥泞开出花朵35 分钟前
LRU缓存淘汰算法的详细介绍与具体实现
java·数据结构·后端·算法·缓存
子洋41 分钟前
快速目录跳转工具 zoxide 使用指南
前端·后端·shell
天下无贼!42 分钟前
【自制组件库】从零到一实现属于自己的 Vue3 组件库!!!
前端·javascript·vue.js·ui·架构·scss