QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

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:131150
用户头像

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

关注

评论

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

JDK 从8升级到11,使用 G1 GC,HBase 性能下降近20%。JDK 到底干了什么?

毕昇JDK社区

在线网页快捷方式创建工具

入门小站

工具

关于 go run 命令执行过程中的“坑坑点点”

liuzhen007

8月日更

Elasticsearch VS ClickHouse

Se7en

网络攻防学习笔记 Day94

穿过生命散发芬芳

网络攻防 8月日更

趁着课余时间学点python(二)缩进 标识符 保留字 注释 输入输出的理解

ベ布小禅

8月日更

我测了啊,我真测了!

QualityFocus

测试 质量保障 线上问题 缺陷

弱口令到底是什么牛马?

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

2020-2021京东Java面试真题解析

Geek_f90455

Java 程序员 后端

Hbase 入门详解

Se7en

2021Java不死我不倒

Geek_f90455

Java 程序员 后端

王者并发课-钻石2:分而治之-如何从原理深入理解ForkJoinPool的快与慢

MetaThoughts

Java 多线程 并发

奥运“哮喘”运动员为什么越来越多?

脑极体

各种消息队列设计要点与对比

海明菌

消息队列 消息队列对比 消息队列系统设计

DDD领域驱动设计·学习应用·一

小诚信驿站

领域驱动设计 领域驱动模型DDD 中台架构 领域驱动

12年高级工程师的“飞升之路”

Geek_f90455

Java 程序员 后端

Windows10下JDK8下载及java环境配置

Bob

8月日更

Linux之watch命令

入门小站

Linux

缓存数据历险记(一)--被缓存警察上课一天

卢卡多多

redis 缓存 8月日更

2020-2021阿里巴巴Java面试真题解析

Geek_f90455

Java 程序员 后端

Vue组件通信之ref

Augus

8月日更

03 设计模式之工厂模式

陈皮的JavaLib

Java 面试 设计模式 工厂模式 8月日更

2021Java岗面试题知识点小结

Geek_f90455

Java 程序员 后端

2021Java开发现状分析

Geek_f90455

Java 程序员 后端

SpringBoot 中的事务处理

xcbeyond

事务 springboot 8月日更

第一次凡尔赛,字节跳动3面+腾讯6面一次过,谈谈我的大厂面经

编程菌

Java 编程 程序员 面试 计算机

2020-2021华为Java面试真题

Geek_f90455

Java 程序员 后端

为什么需要数据库连接池

赖猫

MySQL 数据库 后端 连接池

Druid 通过 dsql 的服务器连接参数如何配置

HoneyMoose

黄金圈法则解读数据中台(1):为什么需要数据中台

水滴

数据中台 黄金圈法则 8月日更

Druid 通过 dsql 进行查询

HoneyMoose

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