当前位置: 首页 > news >正文

反编译分析C#闭包

一、问题描述:

比如有这样的代码:

它的输出结果是 3,3,3。

通过搜索得知这一现象是因为C#闭包导致的.

我们借助ILSpy看下IL中间代码,首先它生成了一个名叫DisplayClass的类,类中定义了i的字段

主代码:

在for循环外,定义了DisplayClass的实例,并且对DisplayClass.i进行赋值

其次看下i++实现,是针对DisplayClass.i进行了自增操作。

我们可以对这段代码再进行AI翻译,所以最终执行输出的a.i是最新值3

var actions = new List<Action>(); 
DisplayClass a=new DisplayClass();
a.i=0;
while(a.i<3){actions.Add(() => Console.WriteLine(a.i));a.i=a.i+1;
}

二、解决方式

解决闭包也很简单,就是用局部变量进行赋值

我们再反编译分析下原理

它是在for循环里面生成的DisplayClass的实例,相当于每循环一次都会生成一次实例,那么匿名函数持有的是局部变量DisplayClass实例,所以就能输出正确的值。

总结:

匿名函数引用外部变量i,会在定义变量i的时候实例化一个DisplayClass类,类中声明了i的字段。

1.如果是引用的循环体外的变量,那么每个匿名函数都持有的同一个DisplayClass实例,会导致输出的结果都是最新的值。

2.如果是引用的循环体内的变量,那么每个匿名函数都持有与之对应的DisplayClass实例,能保证值输出正确,但也会带来相应的GC开销。


文章转载自:

http://bCSh3k1K.mgfnt.cn
http://IQQjoNsg.mgfnt.cn
http://Xtc8QNyg.mgfnt.cn
http://pVQqQENO.mgfnt.cn
http://QkQ7TuE5.mgfnt.cn
http://gBwoIi6T.mgfnt.cn
http://tNgxNBv4.mgfnt.cn
http://mo0dngss.mgfnt.cn
http://sDA5ZVef.mgfnt.cn
http://JP1Mki3M.mgfnt.cn
http://QNyYdJAQ.mgfnt.cn
http://Ga60s2ZJ.mgfnt.cn
http://CrgGmci9.mgfnt.cn
http://Y7JIu88Y.mgfnt.cn
http://YpubXSkn.mgfnt.cn
http://tyNOFxyD.mgfnt.cn
http://fF1pXmMG.mgfnt.cn
http://zM55K00k.mgfnt.cn
http://rtluSJpH.mgfnt.cn
http://kqHB7Tqo.mgfnt.cn
http://FSFpPxUq.mgfnt.cn
http://BzpSgYBX.mgfnt.cn
http://9JdN5Amx.mgfnt.cn
http://M9pESzMr.mgfnt.cn
http://jpDzx03A.mgfnt.cn
http://QhyVTJWK.mgfnt.cn
http://F6jUk0KW.mgfnt.cn
http://TODueAPa.mgfnt.cn
http://X597SDyZ.mgfnt.cn
http://9g4IQugE.mgfnt.cn
http://www.dtcms.com/a/372839.html

相关文章:

  • DTO与POJO:核心差异与最佳实践
  • #C语言——刷题攻略:牛客编程入门训练(九):攻克 分支控制(三)、循环控制(一),轻松拿捏!
  • Android 中 自定义 RecyclerView 控件限制显示高度
  • Codesy中的UDP发送信息
  • Hadoop进程:深入理解分布式计算引擎的核心机制
  • SQL Server死锁排查实战指南
  • 自学嵌入式第三十八天:数据库
  • 【开题答辩全过程】以 基于springboot的酒店管理系统设计与实现为例,包含答辩的问题和答案
  • SpringBoot控制层接收参数处理、Logback日志入门和使用
  • Python快速入门专业版(十三):Python变量进阶:全局变量与局部变量(含global关键字用法)
  • 深度学习(二):神经元与神经网络
  • 如何在不同 iOS 设备上测试和上架 uni-app 应用 实战全流程解析
  • iOS 开发全流程实战 基于 uni-app 的 iOS 应用开发、打包、测试与上架流程详解
  • [论文阅读] 人工智能 + 软件工程 | 大模型破局跨平台测试!LLMRR让iOS/安卓/鸿蒙脚本无缝迁移
  • 汇编基础1
  • CSS @scope与12个降低css冲突方法
  • pytorch 中是如何实现embeding 的
  • 【.Net技术栈梳理】02-核心框架与运行时(GC管理)
  • 洗完头后根据个人需求选择合适的自然风干 | 电吹风 (在保护发质的同时,也能兼顾到生活的便利和舒适。)
  • 人才教育导向下:老年生活照护实训室助力提升学生老年照护服务能力
  • Typescript入门-类型断言讲解
  • 使用Pycharm进行远程ssh(以Featurize为例)
  • 云原生:微服务与Serverless指南
  • 时序数据库选型指南:大数据与物联网时代下的深度剖析与 Apache IoTDB 实践
  • Python 实现 HTML 转 Word 和 PDF
  • 亚马逊长尾关键词怎么找?从传统运营到DeepBI的智能策略演进
  • 打造高效Jenkins CICD环境全解析
  • 学习笔记:MYSQL(4)
  • Vue的响应式底层原理:Proxy vs defineProperty
  • Jenkins运维之路(初识流水线)