写点什么

C#和 Visual Basic 中的闭包与对象生存时期

  • 2007-06-23
  • 本文字数:592 字

    阅读完需:约 2 分钟

C# 2 和即将发布的 VB 9 都允许开发者在匿名方法中引用局部变量。若某匿名方法中引用了某个变量,则该局部变量将被提升为实例变量,并储存于一个叫做闭包(closure)的对象中。提升之后,即使创建该变量的方法执行完毕退出,该变量仍不会消亡。

当指向该匿名函数的所有引用都消失后,该闭包变量即可正常地被垃圾回收器回收。注意到前一句中的“匿名函数”是复数形式(原文为 anonymous functions——译者注)——因为同一个作用域中所有的匿名函数都共享了一个闭包。 Eric Lippert 说这个问题并没有受到足够的关注:

不过,对于同一个作用域中所有的匿名函数都共享了一个闭包的做法,我却没有看到任何人提到过这样会存在问题。虽然这样的设计在语义和概念上都比较容易理解(也比较容易实现),但在垃圾收集方面,这样的做法却有可能导致潜在的问题。

Eric Lippert 在 Blog 中还给出了例子:程序中创建了两个匿名函数,存活时间较短的函数很快即可执行完毕,而存活时间较长的函数则需要一段时间。

假设存活时间较短的委托持有着较为重要稀缺的资源。但是因为作用域中只有一个闭包,所以存活时间较短和较长的两个委托都持有着这同一个闭包。因此只有在两个委托都消亡后,该闭包才能够被垃圾回收。这样,即使那个存活时间较长的委托中并没有使用到该稀缺资源,该资源也只能在存活时间较长的委托结束后才能被释放!

查看英文原文: Closures and Object Lifetime in C# and Visual Basic

2007-06-23 02:131286
用户头像

发布了 37 篇内容, 共 98111 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

直播预告丨大模型+知识库(RAG):如何使能行业数智化?

平平无奇爱好科技

构建高效AI工作流:打造灵活自动化的分步指南

代码忍者

CRISPR-detector:快速、准确地检测、可视化和注释基因组编辑事件引起的全基因组范围突变

INSVAST

基因测序 基因数据分析 生信服务 生信分析 Sentieon

Scheduled线程池实践

FunTester

《Django 5 By Example》阅读笔记:p339-p358

codists

Python django

霍尼韦尔拟将个人安全防护设备业务出售给PIP公司

财见

伟创力完成对Crown Technical Systems公司的收购

财见

双十一华为云Flexus数字人性价比有多高?百元投入即可轻松入手

平平无奇爱好科技

日立携手APIX启动绿色金融创新挑战赛:征集创新绿色融资解决方案

财见

文献解读-Transcriptional Start Site Coverage Analysis in Plasma Cell-Free DNA Reveals Disease Severity and Tissue Specificity of

INSVAST

基因检测 基因数据分析 生信分析 Sentieon

RGB/INT8 输入注意事项

地平线开发者

自动驾驶 算法

双十一入手数字人!华为云Flexus数字人3大优势赋予硬核体验

平平无奇爱好科技

传媒行业必备!双十一购买华为云Flexus数字人后,我总结了3大优势

平平无奇爱好科技

双十一我为什么选择华为云Flexus数字人?广告输出更高效率、更有创意

平平无奇爱好科技

华为鸿蒙智家,推开未来之家的三重门

脑极体

AI 鸿蒙智家

淘宝直播弹幕数据接口爬虫项目技术文档

tbapi

淘宝API接口 淘宝直播间弹幕接口 淘宝直播间接口 淘宝数据分析接口

GeneMind 公司的 GenoLab M 测序平台 WGS 和 WES 数据基准测试

INSVAST

基因测序 基因数据分析 生信服务 生信分析 Sentieon

企业必看:10款知名的公司内部网盘推荐

易成研发中心

如何通过高效的缓存策略无缝加速湖仓查询

镜舟科技

开源 StarRocks Data Cache

专为中小型企业设计!双十一华为云Flexus数字人性价比更高

平平无奇爱好科技

双十一站在中小企业的角度,谈谈我为什么选择华为云Flexus数字人

平平无奇爱好科技

C#和Visual Basic中的闭包与对象生存时期_.NET_Jonathan Allen_InfoQ精选文章