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

总之,尽量少用闭包吧

相关推荐
winrisef1 天前
删除无限递归文件夹
java·ide·python·pycharm·系统安全
悦悦子a啊1 天前
Java面向对象练习:Person类继承与排序
java·开发语言·python
不会算法的小灰1 天前
Spring Boot 实现邮件发送功能:整合 JavaMailSender 与 FreeMarker 模板
java·spring boot·后端
come112341 天前
深入理解 Java和Go语法和使用场景(指南十一)
java·开发语言·golang
IT_陈寒1 天前
Vite 5.0 性能优化实战:3 个关键配置让你的构建速度提升50%
前端·人工智能·后端
excel1 天前
Vue2 动态添加属性导致页面不更新的原因与解决方案
前端
GISer_Jing1 天前
明天好好总结汇总分析博客
前端·javascript·面试
做运维的阿瑞1 天前
Windows 环境下安装 Node.js 和 Vue.js 框架完全指南
前端·javascript·vue.js·windows·node.js
李贺梖梖1 天前
DAY23 单例设计模式、多例设计模式、枚举、工厂设计模式、动态代理
java
武昌库里写JAVA1 天前
Java设计模式之工厂模式
java·vue.js·spring boot·后端·sql