11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

.NET 变得不可变

  • 2013-01-20
  • 本文字数:921 字

    阅读完需:约 3 分钟

.NET 开发中一个常见的误区是,认为 IEnumerable 或 ReadOnlyCollectionl 类型的变量是线程安全的。微软的 Andrew Arnott 解释道:

如果有人给你一个 ReadOnlyCollection、IReadOnlyList或 IEnumerable,唯一能保证的是你无法修改它们的数据,但却不能保证给你集合的人不会修改。不过对于数据不会改变这点,你往往需要一些信心。这些类型在改变内容时不会提供事件通知,并且如果在你迭代其内容的时候,集合真的改变了,这是否会发生在不同的线程呢?这种行为将造成应用程序中的数据崩溃和随机异常。

要在你想用 IEnumerable 或 ReadOnlyCollection 的地方提供真正线程安全的集合,微软 BCL 小组提供了一组不可变集合的预览版。基于函数式编程的技术,对于那些通常会改变集合的方法将会创建一个新集合来代替。为了提高效率,可能会在新旧集合之间进行数据共享。

不可变集合一个有意思的特点是没有公共构造函数。相反,它们总是以 ImmutableXxx.Empty 作为开始。Andrew 写到

使用静态 Empty 属性与传统模式相背离,但这么做是有原因的。构造函数必须要分配一个对象,但由于这些集合的不可变性,新的对象永远只能表示空的列表。鉴于修改集合会创建新的集合,因此使用构造函数会导致创建多个表示空列表的对象,这显然是种浪费。静态属性返回空列表的单例,应用程序中的所有代码都可以共享该单例。

建造者和集合

由于内存分配,构建一个不可变集合是相当昂贵的。我们已经在字符串(即字符的不可变集合)身上看到了这一点。为了缓解这一点,不可变集合将暴露一个 ToBuilder 方法,返回一个可以廉价修改的建造者对象。得到之后,还可以简单地使用 ToImmutable 再次得到不可变集合。

性能

不可变集合的性能可能会非常棘手。如下表所示,大多数不可变集合的时间复杂度都相当不错,并且是稳定的,不必担心在集合内部数组的最大尺寸会触发集合的完全拷贝。与普通集合不同,不可变集合中的项如果被移除,将会释放不用的空间。

但还是会有成本。每个操作都要在内存中分配另一个对象,给 GC 带来压力。最大的胜利是在创建集合的快照拷贝时。但最终的建议仍然是:使用最简单的代码完成工作,并在必要的时候调整性能。 该预览版可通过 Microsoft.Bcl.Immutable NuGet 包下载。

查看英文原文.NET Goes Immutable

2013-01-20 06:492027
用户头像

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

关注

评论

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

SUSE Rancher v2.6.5 社区版核心功能解读

Rancher

Kubernetes k8s rancher NeuVector

【直播回顾】OpenHarmony知识赋能第五期第五课——多媒体子系统之视频解读

OpenHarmony开发者社区

OpenHarmony 多媒体

盲盒APP开发的六大功能模式基础设置

WDL22119

盲盒商城 盲盒 盲盒开发 盲盒小程序开发 小程序开发

Google Guava中EventBus使用不当会导致什么故障?

BUG侦探

kafka Guava EventBus

涛思数据与中天钢铁签署战略合作协议,加速钢铁行业的数字化发展

TDengine

数据库 tdengine

数据分析软件有哪些分类?

情报分析师

数据分析 数据可视化 知识图谱 分析软件 分析工具

预约直播|阿里云CDP 产品发布会

阿里云大数据AI技术

CDP 产品发布

520,解锁开发者的专属浪漫

葡萄城技术团队

情人节 520

JavaScript类型转换

源字节1号

比渗透测试更有用,红队演练该如何开展?

青藤云安全

使用 jMeter 对需要 User Authentication 的 Restful API 进行并发负载测试

Jerry Wang

Java Jmeter 性能测试 SAP 5月月更

部署在Azure上的SAS Viya可为客户带来204%的投资回报率

新闻科技资讯

thinkphp 中 fetch 方法怎么用

CRMEB

FinClip SaaS 版上线啦

FinClip

What? 从小程序反向生成App?!

FinClip

Seata 企业版正式开放公测

阿里巴巴云原生

阿里云 开源 云原生 seata

飞书、钉钉和企微的三巨头之争下,其他厂商在移动平台赛道如何奋起直追?

WorkPlus Lite

年薪80W,在大厂呆了10年的我,被裁得心服口服

博文视点Broadview

许北林:我为什么加入OpenHarmony生态?又为什么要做“启航KP”开发套件?

OpenHarmony开发者社区

OpenHarmony 开发者故事

作为软件工程师,给年轻时的自己的建议(上)

禅道项目管理

程序员 工程师 职业成长

这知识点真细,Python获取HTTP响应头和响应体

梦想橡皮擦

5月月更

架构实战营 第 6 期 模块六课后作业

火钳刘明

#架构实战营 「架构实战营」

业务逻辑的灵魂在哪里?

情报分析师

数据分析 数据建模 数据可视化 分析软件 分析思维

最优的纯文本模型?GPT-4蓄势待发

OneFlow

人工智能 模型 预测 openai

FinClip 前端之 VUE 核心原理总结

FinClip

代码重构,真的只有复杂化一条路吗?

华为云开发者联盟

代码 代码重构 过度设计 代码设计

喜大普奔 | FinClip Hackathon 2022 结果宣布, Top3 项目出炉!

FinClip

520,用Python定制你的《本草纲目女孩》

华为云开发者联盟

Python 华为云 modelarts 本草纲目女孩 MoXing

如何在 Web 应用里消费 SAP Leonardo 的机器学习 API

Jerry Wang

机器学习 前端开发 前端框架 SAP 5月月更

31点经验分享与吐槽

老白鹿

.NET变得不可变_.NET_Jonathan Allen_InfoQ精选文章