写点什么

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

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

关注

评论

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

蚂蚁安全科技 Nydus 镜像加速实践

SOFAStack

开源 镜像 镜像安全 OCI Nydus

5.10版本的linux内核setup_kmalloc_cache_index_table函数解析

linux大本营

内存管理 内存泄漏 Linux内核

Apifox WebSocket 调试功能你会用了吗?

Apifox

程序员 接口 websocket API API 调试

麻了,不要再动不动就BeanUtil.copyProperties!

大连理工大学OpenHarmony技术俱乐部正式揭牌成立

极客天地

Springboot之如何纯文本转成.csv格式文件?|超级详细,建议收藏

bug菌

Spring Boot 2 spring-boot 三周年连更

sougou的workflow的10个技术点

linux大本营

workflow 异步框架 C++

Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)

汀丶人工智能

人工智能 机器学习 深度学习 Gradio AI可视化

华为开发者大赛中国区正式启动 携手探索ICT无限可能

极客天地

用AI赋能基础教育,小度人工智能青竹公开课现已走进6所知名小学

科技热闻

一个解决tcp粘包问题的c++代码

linux大本营

TCP 网络协议 C++ TCP 粘包

linuxc获取文件内容

linux大本营

Linux

Spring Boot 整合 Redis 基于 Stream 消息队列 实现异步秒杀下单

第二届广州·琶洲算法大赛启动,百度飞桨助力广州打造中国算法新高地

飞桨PaddlePaddle

算法 百度飞桨 文心大模型

在毫秒量级上做到“更快”!DataTester助力飞书提升页面秒开率

字节跳动数据平台

大数据 AB testing实战 用户体验 企业号 4 月 PK 榜 秒开率

awk常量和标识符

linux大本营

脚本 awk

用c++写一段快速排序算法

linux大本营

排序算法 数据结构与算法 C++

5.10版本的linux内核pgtable_init函数解析

linux大本营

Linux内核

eBPF的发展演进---从石器时代到成为神(二)

统信软件

Linux Kenel 内核 Linux内核

机器学习分布式框架Ray

AIWeker

Python 分布式 python小知识 三周年连更

使用了Spring的事件机制真香!

Java spring

c++实现一个tcp高性能网络服务器

linux大本营

TCP 多线程 异步IO epoll 高性能服务器

强强联手:机器学习与运筹学

鼎道智联

算法

阿里新一代微服务,内部大佬手抄的笔记+脑图不容错过,全是精华

Java 架构 微服务 Spring Cloud Aliababa

ByteHouse云数仓版查询性能优化和MySQL生态完善

NineData

数据库 架构 字节跳动 Clickhouse bytehouse

Apache Flink ML 2.2.0 发布公告

阿里云大数据AI技术

大数据 算法 企业号 4 月 PK 榜

Linux常用命令

追赶者

进程 SSH Liunx 端口占用

【微信小程序管理】第三方软件的优势有哪些

没有用户名丶

ChatGPT 会在三年内终结编程吗?| 社区征文

神木鼎

三周年征文

和面试官聊1小时Java并发,多亏GitHub上这份笔记

Java 并发编程

sqlserver锁表产生的原因

linux大本营

数据库· SQL sever 表锁

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