2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

在 C#6 和 VB 12 中不可变对象 (Immutable Objects ) 更易用

  • 2014-08-18
  • 本文字数:1211 字

    阅读完需:约 4 分钟

.NET 编程中的一个痛点: 为了实现不可变对象 (Immutable Objects ),需要编写大量样板代码。 不可变类 (immutable class) 不同于一个普通的类,它要求每个属性具有一个单独定义的字段,当然,还需要通过一个构造函数来填充每个字段的填。

根据新的规范草案,C#和 VB 将增加一个称为“记录类”(record class)的特性。实质上, 它是仅由在构造函数中定义的不可变类 (immutable class)。

下面是规范的一行代码示例:

public record class Cartesian(double x: X, double y: Y);除了这个构造函数外,编译器会自动创建:

  • 生成每个参数的只读属性(read-only property)
  • 生成 Equals 函数
  • 重写 GetHashCode 函数
  • 重写 ToString 函数
  • 生成一个“is”操作符,在 VB 中称为“Matches”

“is/Matches”操作符被用于模式匹配 (pattern matching),我们会在未来的文章涉及到。除此之外,记录类(record classes)和 C#匿名类型(anonymous types)很相近(和 VB 的匿名类型有所不同,它们默认是可变的)。对这两种概念,微软正研究如何协调,尤其是基于现有的程序集中,还不能对外暴露匿名类型接口。

不可变类型的一个通用特性是在对对象的一个或多个字段进行改变后,会自动产生当前对象的拷贝。虽然在规范中没有提到,但微软正在考虑为 C#提供如下方式作为一种选项:

复制代码
var x1 = new MyRecord(1, 2, 3);
var x2 = x1 with B: 16;
Console.WriteLine(x2) // prints something like "A = 1, B = 16, C = 3"

扩展记录类

你可能已经注意到,在 Cartesian 示例类中,用分号表示结束。表明该类不包含任何类体,只保留由编译器负责自动生成提供的那部分。

除了直接使用分号结束定义,你还可以像一个普通的类一样,通过提供一组大括号,并添加其他属性和方法。编译后,你仍然会得到编译器自动生成的代码。

其他限制

目前还暂时只支持记录类(record classes)。在理论上,也能够使用相同的基本语法和概念进行添加记录结构体(record structs)。

类库支持问题

在.NET 中使用不可变类型(immutable types)有一个严重的限制,即它缺乏广泛的类库支持。想象一下,如果你是一个负责中间层的开发者,那你每日的工作很可能就是通过 ORM 从数据库获取一些对象,然后再序列化到 SOAP-XML 或 JSON,然后以单向或者双向的方式传递给客户端。

但是, 目前的大多数的 ORM 及序列化支持不可变类型(immutable types),它们会假定该类型具有一个无参数的构造函数,并且包含一些可变的属性。如果这个问题没有在这些流行的框架中解决,那么在大多数工程项目中记录类(record classes)将用处不大。

欲了解更多信息,请参见草案规范 Pattern Matching for C#。该原型应该可以在数周内发布。

查看原文链接: Easier Immutable Objects in C# 6 and VB 12


感谢邵思华对本文的审校。

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

2014-08-18 01:501952
用户头像
王文刚 Instagram 营销专家

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

关注

评论

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

云小课|MRS基础原理之Hue组件介绍

华为云开发者联盟

大数据 华为云 企业号 2 月 PK 榜 华为云开发者联盟

Wallys/QSDK IPQ6010/wifi mesh function supports qcn9074/qcn6024 M.2 E Key Interface

Cindy-wallys

IPQ6010 ipq6018 IPQ6000

这周末,StarRocks 邀请开发者们一起来上海 GAIDC 开源集市,各种任务等你来挑战!

StarRocks

数据库

DevEco Studio端云协同开发之云函数

白晓明

HarmonyOS 端云协同 云函数

在字节跳动,造赛博古籍

字节跳动技术范儿

后端 nlp 搜索 OCR 多模态

深入浅出玩转监控宝|网站监控之创建网站监控任务

云智慧AIOps社区

监控宝 监控工具 监控指标 #监控 网站监控

揭穿数据分析的六大谎言

葡萄城技术团队

父母、离别

毛广斌

生活

多模并起,万向融合 | 2023年2月《中国数据库行业分析报告》精彩抢先看

墨天轮

数据库 HTAP MatrixDB 多模数据库 超融合数据库

平时报表很复杂吗?瓴羊Quick BI智能报表轻松解决!

夏日星河

阿里张勇:全力投入生成式AI大模型建设,为行业发展提供好算力支撑

阿里技术

人工智能 云计算

云数据库TiDB-试用

TiDB 社区干货传送门

管理与运维 版本测评 安装 & 部署

ZBC通证月内已翻倍,Nautilus Chain 上线前夕的“开门红”

股市老人

行云管家属于高新企业吗?安全吗?

行云管家

云计算 网络安全 高新企业 云管理 高新技术

中冶赛迪:基于鲲鹏DevKit开发智慧城市基础设施管理平台,性能提升47%

极客天地

在流媒体时代,如何看待音乐版权?

曲多多(嗨翻屋)版权音乐

知识产权 音乐 版权

瓴羊Quick BI率先提供移动端自助分析整体解决方案,成为行业的领导者!

流量猫猫头

Fine BI、Smart BI怎么办,瓴羊Quick BI已经可以提供移动端自助分析整体解决方案!

对不起该用户已成仙‖

华为云CodeArts Artifact,5大特性守护制品质量与安全

华为云开发者联盟

云计算 开发 华为云 企业号 2 月 PK 榜 华为云开发者联盟

NFTScan 与 KNN3 在 NFT 数据层面达成合作伙伴关系

NFT Research

NFT web3

ChatGPT对于普通人有什么机会和影响?

引迈信息

人工智能 AI AIGC ChatGPT

不要 ChatGPT,我们要你!2023 涛思招聘季重磅来袭~

TDengine

数据库 tdengine 时序数据库

ZBC通证月内已翻倍,Nautilus Chain 上线前夕的“开门红”

鳄鱼视界

LeetCode题解:2357. 使数组中所有元素都等于零,哈希表,详细注释

Lee Chen

JavaScript 算法 LeetCode 哈希表

电商难做?低代码开发平台为企业转型升级保驾护航

加入高科技仿生人

低代码 电商 数据管理 b2b

云数据库 TiDB 初使用

TiDB 社区干货传送门

版本测评 安装 & 部署 性能测评 扩/缩容 6.x 实践

TiDB x Aliyun 免费试用,竟还有这般福利?

TiDB 社区干货传送门

社区活动 版本测评 6.x 实践

LeetCode题解:2357. 使数组中所有元素都等于零,排序,详细注释

Lee Chen

JavaScript 算法 LeetCode

数据库审计有什么用?过等保三级需要吗?

行云管家

数据库 等保 等级保护 数据库审计

C++中const和constexpr关键字解析:常量、函数和指针

小万哥

程序员 后端 开发 C/C++ const

在C#6和VB 12中不可变对象(Immutable Objects )更易用_C#_Jonathan Allen_InfoQ精选文章