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

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

关注

评论

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

分布式系统中的分布式链路追踪与分布式调用链路

天翼云开发者社区

分布式系统 网络

第五代英特尔至强可扩展处理器以强劲性能,打造更“全能”的计算

E科讯

实战讲解|Trino 在袋鼠云数栈的探索与实践

袋鼠云数栈

大数据 前端 计算引擎 trino

低功耗DC-DC电源模块的精细化PCB设计

华秋电子

淘宝/天猫店铺商品详情 API 实现实时数据获取:快速、稳定、高效

Noah

MacOS远程管理软件哪款好?Royal TSX for Mac v6.0.2激活版

南屿

Royal TSX 教程 MacOS远程管理 Royal TSX mac破解版

住宅代理IP在保护品牌形象中起到关键性作用

摘星星的猫

师爷,翻译翻译什么叫AOP

不在线第一只蜗牛

Java 数据库 前端 aop

ICDM'23 BICE论文解读:基于双向LSTM和集成学习的模型框架

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 论文解读

云行| 国云筑基 焕新启航,天翼云中国行·东莞站圆满举行!

天翼云开发者社区

云计算 数字化 云电脑

如何利用容器与中间件实现微服务架构下的高可用性和弹性扩展

天翼云开发者社区

架构 微服务

K8S学习指南(4)-minikube的使用

俞兆鹏

集合-Java-笛卡尔积、平铺

alexgaoyh

Java 集合运算 笛卡尔积 数据平铺

解读|如何利用 NFTScan 解锁当前 NFT 生态走势

NFT Research

NFT\ NFTScan NFT开发

React Native性能优化指南

测试管理训练营马上开营! 快来免费领取试听课吧~

测试人

软件测试 测试 自动化测试 测试开发

低代码为何这么“香”

华为云开发者联盟

低代码 开发 华为云 华为云开发者联盟 华为云Astro

工作中使用Redis的10种场景

快乐非自愿限量之名

数据库 redis 前端 开发

一文教会你!如何利用火焰图快速定位内存泄漏?b

Greptime 格睿科技

数据库 rust 内存泄漏

Solidity案例详解(一)存钱罐合约

BSN研习社

区块链 Solidity

微信多开助手for mac下载

iMac小白

Hex-Rays IDA Pro(交互式反汇编工具) v7.7汉化版

南屿

IDA Pro 静态反编译工具

Flink Kubernetes Operator 介绍

数新网络官方账号

flink

面试官:SpringBoot如何实现缓存预热?

王磊

Java 面试

与达沃斯同行 | XTransfer与达沃斯百位全球创新者“头脑风暴”

XTransfer技术

推动SiCMOSFET国产化,华秋获“芯塔电子”优秀媒体合作伙伴奖

华秋电子

揭秘代币价值:Token Explorer 带您洞察市场,把握投资先机

Footprint Analytics

Token 代币

k8s探针详解

EquatorCoco

Kubernetes k8s 容器化

Flask请求与响应-视图函数处理请求数据

测试人

软件测试 测试 自动化测试 测试开发

1688公司档案信息数据接口采集Python

tbapi

1688API接口 1688公司档案信息接口

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