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

总之,尽量少用闭包吧

相关推荐
景庆1971 分钟前
vscode启动springBoot项目配置,激活环境
java·开发语言·vscode
小则又沐风a1 分钟前
Linux使用指南和基础指令(1)
java·linux·运维
GISer_Jing1 分钟前
微软AI战略全景:从基础设施到智能体生态
前端·人工智能·microsoft
发际线向北3 分钟前
0x03 单元测试与Junit
前端·单元测试
忆往wu前4 分钟前
搞懂 SPA 再学路由!Vue Router 从0到完善 + 嵌套路由一次性梳理
前端·vue.js
Aliex_git5 分钟前
前端监控笔记(三)
前端·笔记·学习
M ? A6 分钟前
Vue Suspense 组件在 React 中,VuReact 会如何实现?
前端·javascript·vue.js·经验分享·react.js·面试·vureact
筱璦9 分钟前
C#期货分仓、策略交易模拟演示系统(含资源下载)
开发语言·c#·策略模式·量化交易·期货交易
唐青枫10 分钟前
C#.NET Task 与 async await 深入解析:底层原理、执行流程与实战误区
c#·.net
天才熊猫君10 分钟前
通用 Loading 状态管理器
前端·javascript·vue.js