硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

简化 C#的不可变对象图

  • 2013-05-15
  • 本文字数:1070 字

    阅读完需:约 4 分钟

在 C#中创建一个简单的不可变类很容易,开发者只需要创建一个构造函数且不创建公共 setter。但这往往还不够。最终开发者或许会想要创建深层图,考虑到效率原因,应该通过建造者(builder)创建它。或者也许开发者想要创建一些方法,返回包含已变更字段的该对象的复本(如 DateTime 的 AddMinutes 方法),以此来实现非破坏性更新。构建全部这些建造者和方法非常冗长乏味,因此也容易出错。

Andrew L Arnott 提出了一个解决方案,它依靠基于 T4 的代码生成器。T4 代表“文本模版转换工具包”,Text Template Transformation Toolkit。它处于 Visual Studio 代码生成功能的核心位置,诸如实体框架等库都依赖它。Andrew 的 T4 脚本接收一个可变类并创建一个不可变的版本。

该工具包做出了一个略有争议的决定,即不生成公共构造器。相反,他期望开发者使用静态的 Create 方法,或是从 Default 实例开始然后修改它。这通过使用 WithXxx 方法实现,每个属性都有一个对应的方法。

不过,我们可以做更多的改进。对拥有许多属性的类,如果我们需要一次改变若干属性,那么在每个属性变更时都分配一个新对象作为中间步骤,将是一种浪费并且会增加 GC 的压力。因此我们还添加了一个 With 方法,为每个出现在类中的属性接收可选参数,从而支持属性的批量变更。最后,对于需要对对象进行多处变更,却又希望通过多个步骤实现(或者只是倾向于使用属性 setter 而不是调用 With- 方法)的场景,我们可以创建一个 Builder 类,它在构建过程中使用可变的类 ,并且将在完成后返回一个不可变复本。这一模式与.Net Framework 中的 String 和 StringBuilder 非常类似,也与之前提到过的最新不可变集合相似。

当然,如果开发者不喜欢这些决定,也可以很容易地修改 T4 模版。Andrew 故意将模版分解成更小的文件,从而让修改变得更容易。开发者还可以添加自己的扩展而无需对基础模版进行重大改变。

与所有良好编写的代码生成器相似,这里也大量使用了分部方法。分部方法允许开发者向代码生成器生成的方法中添加额外的逻辑,而不必修改生成的文件。例如,开发者可以实现一个类来为不可变对象设定部分默认值。未实现的分部方法将被编译器自动剥离出来,因此不会导致运行时开销。

开发者如果希望进一步了解 Arron 的实验,可以在他的博客中阅读关于不可变对象图的文章。

查看英文原文 Making Immutable Object Graphs Easier in C#


感谢姚琪琳对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013-05-15 09:272166
用户头像

发布了 256 篇内容, 共 85.0 次阅读, 收获喜欢 10 次。

关注

评论

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

天猫商品详情 API 接口:功能、调用与实战攻略

tbapi

天猫商品详情接口 天猫API 天猫数据采集 天猫商品详情api

程序员必备:使用Cursor+MCP 提高开发效率+避坑指南

博文视点Broadview

音乐NFT项目开发的性能优化

北京木奇移动技术有限公司

区块链技术 软件外包公司 音乐NFT

MCP云托管最优解,揭秘国内最大MCP中文社区背后的运行时

阿里巴巴云原生

阿里云 Serverless 云原生

驭电·新境 长安马自达MAZDA EZ-60全球首秀

极客天地

MES:助力新材料行业实现无纸化与智能制造

万界星空科技

mes 新材料 新材料mes 新材料行业

【前瞻技术布局】打破“沙漏“现象→提高生成式搜索/推荐的上限

京东科技开发者

告别提示词混乱!梦精灵提示词管理器让创作更高效​

龙正哲

Prompt prompt 工程 提示词管理

中科曙光AI竞争力领跑全国TOP100榜单

科技热闻

25年青海省正规等保测评机构名单汇总

行云管家

等保 等级保护 等保测评

别再用“过时源码”做陪玩小程序!这版代码让用户留存率飙升60%的3个狠招

DUOKE七七

中昊芯英作为“杭州 AI 18 罗汉”荣登《杭州 AI 卧龙图》

科技热闻

百度智能云推出千帆数据智能平台

科技热闻

从“被动应对”到“主动合规”——零信任架构下的等保 2.0 与密评密改双合规

权说安全

网络安全 密码 零信任

上门预约家政系统平台网站/app/小程序源码

网站,小程序,APP开发定制

《Operating System Concepts》阅读笔记:p808-p820

codists

操作系统

Aloudata Agent 36 问,深度解惑!

Aloudata

数据分析 大模型 指标平台 ChatBI 智能问数

腾讯云全球生态大会成都峰会:一场技术与生态的深度对话

VyrnSynx

腾讯云 腾讯数字生态大会 技术嘉年华 腾讯云智能 腾讯云 AI 代码助手

原生App和H5 App的对比

北京木奇移动技术有限公司

软件外包公司 原生APP开发 APP外包公司

设计模式-策略模式

京东科技开发者

行稳、致远 | 技术驱动下的思考感悟

京东科技开发者

敏捷开发框架下的低代码应用:交付效率与代码质量的协同优化路径

JeeLowCode低代码平台

低代码 低代码开发 低代码平台 低代码, 低代码引擎

一文彻底搞懂Transformer:原理、应用与测试开发指南

测试人

人工智能

怎么彻底清除Mac的系统数据?MacBook释放存储空间一文通

阿拉灯神丁

存储空间 CleanMyMac 苹果电脑必备软件 系统清理软件 mac系统维护

当AI代理遇上DeCloud会发生什么?

PowerVerse

AI 算力 web3 DePIN DeCloud

原生App和H5 App的性能比较

北京木奇移动技术有限公司

APP开发 软件外包公司 APP外包

AI与智能农业:如何通过精准农业提升作物产量与资源使用效率?

天津汇柏科技有限公司

人工智能

Web3项目的开发的性能测试

北京木奇移动技术有限公司

软件外包公司 APP外包公司 APP开发公司

跨境物流公司有必要买堡垒机吗?

行云管家

网络安全 数据安全 堡垒机 跨境电商

什么是采购管理?如何做好采购管理?

积木链小链

数字化转型 数字化 智能制造

原生 APP 的性能测试

北京木奇移动技术有限公司

软件外包公司 APP外包公司 APP开发公司

简化C#的不可变对象图_后端_Jonathan Allen_InfoQ精选文章