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

总之,尽量少用闭包吧

相关推荐
wand codemonkey12 分钟前
SpringbootWeb【入门】+MySQL【安装】+【DataDrip安装 】+【连接MySQL】
java·mysql·mybatis
Highcharts.js1 小时前
缺失数据可视化图表开发实战|Highcharts创建人员出生统计面积图表示例
开发语言·前端·javascript·信息可视化·highcharts·图表开发
LaughingZhu8 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
怕浪猫8 小时前
Electron 开发实战(一):从零入门核心基础与环境搭建
前端·electron·ai编程
Mahir088 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
加号38 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
小鹏linux9 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
RyFit9 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码9 小时前
C++ 内存分区 堆区
java·开发语言·c++
前端若水10 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js