写点什么

在 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:501614
用户头像
王文刚 Instagram 营销专家

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

关注

评论

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

墨天轮访谈 | 拓扑岭雷鹏:数据库新思维下的弹性压缩与内存计算

墨天轮

数据库 redis 国产数据库 键值数据库

浪潮信息加入,已完成与龙蜥操作系统产品兼容性验证

OpenAnolis小助手

云计算 服务器 龙蜥社区 CLA 浪潮

设备如何使用go sdk轻松连接华为云IoT平台

华为云开发者联盟

华为云 sdk go sdk IoT平台 华为云IoT平台

AIRIOT物联网低代码平台如何配置OPC DA驱动?

AIRIOT

驱动配置

云管平台有哪几家?现在采购福利哪家好?

行云管家

云计算 混合云 云管平台

零基础开启 Neo 开发之旅,NEP17 智能合约实战教学

TinTinLand

区块链

如何选择不同类型的AI服务器?

Finovy Cloud

人工智能 gpu GPU服务器 GPU算力

#FlyFish现金激励计划# 参与开源项目,赢万元现金!

云智慧AIOps社区

JavaScript 大前端 活动 开源项目 可视化编排

与 Dfinity 明星项目面对面,各大赛道开发经验一览

TinTinLand

区块链

华为数字化转型实践

乌龟哥哥

4月月更

硬核!8个类手写一个配置中心!

码农参上

微服务 配置中心 4月月更

零基础学Java第二节(运算符、输入、选择流程控制)

五分钟学大数据

Java 4月月更

智汇华云 | flashcache原理及实践

华云数据

Java全栈开发---Java ERP系统开发:商业ERP(七

爱好编程进阶

Java 程序员 后端开发

加入 Flow ,共同成为 Web3的建设者

TinTinLand

区块链

最新区块链招聘:高薪招开发产品运营人才

TinTinLand

区块链

以图搜图应用篇-家具家居行业

视觉智能

人工智能 以图搜图 图像搜索 视觉智能

阿里大牛评:入门到大成!GitHub新上线并发编程深度解析实战PDF

Java架构追梦

Java 后端开发 程序员面试

21天连更回归,这个五一宅家写作,挑战一触即发!

InfoQ写作社区官方

热门活动 5月月更

10天“背书”这份200多页PDF,远程通过头条,阿里,Java岗面试

Java架构追梦

Java 后端开发 程序员面试

凭借这份Spring Cloud教程,成功拿下阿里,头条面试

Java架构追梦

程序员 java面试 后端开发 Spring 框架漏洞

开发一个不需要重写成Hive QL的大数据SQL引擎

华为云开发者联盟

sql 大数据 mapreduce SQL引擎 大数据仓库

如何在优麒麟上进行超大型文件的远程传输?这个命令帮你快速搞定!

优麒麟

Linux 开源 命令行 优麒麟 远程传输

【等保小知识】等保测评是安全认证吗?

行云管家

等保 等级保护 等保测评 安全认证

搞懂这份大厂Java面试知识点笔记汇总,涨薪15K你也没问题

Java架构追梦

Java 程序员 后端开发

网络协议之:haproxy的Proxy Protocol代理协议

程序那些事

Java Netty 程序那些事 4月月更

科创人·SUSE大中华区董事长江永清:真开源要有打磨技术的匠心,要能持续创造社会价值

科创人

广袤之中:沿着克拉克三大定律,读懂华为的最深期待

脑极体

科创人·数智未来私董会第4期:转型的实证-幸存者偏差与盲人摸象| 活动报名

科创人

迎战大厂!“金三银四”和通过率达95%的Java面试八股文

Java架构追梦

Java 后端开发 程序员面试

为团队投资CRM系统的投资回报率是多少?

低代码小观

CRM 客户关系管理 低代码开发 CRM系统 客户关系管理系统

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