写点什么

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

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

关注

评论

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

分享:数据库存储与索引技术(二) 分布式数据库基石——LSM树

OceanBase 数据库

数据库 oceanbase

MobTech|什么是SDK

MobTech袤博科技

GPT-4会取代程序员吗?

这我可不懂

人工智能 低代码 JNPF GPT-4

Flink Table Store 独立孵化启动 ,Apache Paimon 诞生

Apache Flink

大数据 flink 实时计算

保利威1号演播厅重磅亮相,「新品+标准」引领企业进入元宇宙直播

ToB行业头条

CNStack 云边协同平台:实现原生边缘竟能如此简单

阿里巴巴云原生

阿里云 云原生 CNStack

Python之configparser模块详解和使用

Python 测试 自动化测试 pytest 测试报告

智能公厕应用人工智能技术,实现智慧化管理与服务

光明源智慧厕所

智慧城市

MobTech|场景唤醒的实现

MobTech袤博科技

flutter系列之:在flutter中使用媒体播放器

程序那些事

flutter 架构 大前端 程序那些事

统一观测丨使用 Prometheus 监控 SNMP,我们该关注哪些指标?

阿里巴巴云原生

阿里云 云原生 Prometheus snmp

终于学完国内算法牛人10年经验总结的数据结构与算法详解文档

做梦都在改BUG

Java 数据结构 算法

2+1链动模式商城开发系统案例

薇電13242772558

NFT

策略 | 通过 NFTScan 进行 NFT 投资组合的管理和信息追踪

NFT Research

NFT NFTScan

自学网络安全不知道这些,劝你提早放弃

喀拉峻

黑客 网络安全 自学

mac电脑打开应用“意外退出”的问题

互联网搬砖工作者

大厂直通车!GitHub独一份的Jenkins+k8s核心知识笔记(全彩版)

做梦都在改BUG

Java Kubernetes k8s jenkins

谷歌架构师分享gRPC与云原生应用开发Go和Java为例文档

做梦都在改BUG

Java gRPC 云原生

容量王者,超级电容容量为何这么大???

元器件秋姐

科普 汽车电子 元器件 新能源 电容

用AI回忆起曾被忘却的语言

脑极体

AI

Tapdata 赋能敏捷转型:头部知识付费应用如何搭载实时数据快速提升人效,创造业务增长点

tapdata

数据库

Koordinator 助力 ACK 容器调度升级,提升应用性能,节约资源成本

阿里巴巴云原生

阿里云 容器 云原生 Koordinator

Spring 源码解析-从源码角度看bean的循环依赖

做梦都在改BUG

Java spring 源码

业界首发丨《云原生网络数据面可观测性最佳实践》重磅来袭

阿里巴巴云原生

阿里云 云原生 可观测

Mac苹果电脑怎么调整磁盘分区大小

互联网搬砖工作者

数智转型助力建筑业全产业链升级,你了解多少?

加入高科技仿生人

低代码 数字孪生 数智化 建筑业

从底层操作系统到容器云平台:OpenCloudOS与秒云构筑完美兼容链

OpenCloudOS

Linux 云平台

分享:数据库存储与索引技术(三)LSM树实现案例

OceanBase 数据库

数据库 oceanbase

云端集成更便捷,得帆云iPaaS助力企业上云更成功!

得帆信息

平台 云产品

从反脆弱角度说一说:技术系统高可用性策略

做梦都在改BUG

Java 高可用

OceanBase发布全新Logo,寓意「流动的数据」

OceanBase 数据库

数据库 oceanbase

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