【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

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

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

关注

评论

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

从一盏路灯,看亿万级物联网联接的智能之路

华为云开发者联盟

物联网 IoT 华为云 LiteOS NB- IoT

1688 商家基于 HarmonyOS 的多屏协同直播技术方案

阿里巴巴终端技术

ios android 客户端开发 HarmonyOS 直播技术

CSS架构之Base层

Augus

CSS 10月月更

看动画学算法之:栈stack

程序那些事

数据结构 算法 看动画学算法 程序那些事 stack

StreamNative 宣布 2300 万美元 A 轮融资,Prosperity7 Ventures 与华泰创新联合领投

Apache Pulsar

融资 Apache Pulsar StreamNative

解决外卖配送最后一公里:外卖柜存在哪些问题

石头IT视角

华云大咖说 | 安超ArSDN云安全场景方案

华云数据

信创 华云数据 安超

新人融入团队的必备python技巧,python 编码规范,滚雪球学Python第4季12篇

梦想橡皮擦

10月月更

uni-app技术分享| 用uni-app实现拖动的诀窍

anyRTC开发者

uni-app 音视频 WebRTC 移动开发 视频通话

[初恋系列]一个让初恋爱不释手的购物平台(电商系统微服务拆分)

人工智能~~~

微服务 电商平台 拆分 电商系统

【LeetCode】搜索旋转排序数组Java题解

Albert

算法 LeetCode 10月月更

深入剖析 Spring WebFlux

vivo互联网技术

spring WebFlux java

当物联网遇上云原生:K8s向边缘计算渗透中

华为云开发者联盟

Kubernetes 云原生 物联网 边缘计算 kubeedge

信息流推荐系统智能交付解决方案探索

百度Geek说

后端

一个神器,让写东西快得飞起

锋享前端

小工具

北冥多样性计算融合架构系列解读之 一文读懂华为MindStudio统一工具链 多样性计算系统下的开发挑战

Geek_32c4d0

算力 多样性计算 北冥

【Flutter 专题】31 图解 TextPainter 与 TextSpan 小尝试

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

👊 【Spring技术实战】@Async机制的使用技巧以及异步注解源码解析

洛神灬殇

Java spring API 10月月更

北冥多样性计算融合架构系列解读之 一文读懂北冥基础使能:毕昇C++编译器及北冥融合加速库

Geek_32c4d0

北冥多样性计算融合架构系列解读之 一文读懂华为多瑙统一调度器

Geek_32c4d0

「ANR」Android SIGQUIT(3) 信号拦截与处理

阿里巴巴终端技术

android 信号量 anr

北冥多样性计算融合架构系列解读之 一文读懂华为昇思科学计算

Geek_32c4d0

和12岁小同志搞创客开发:如何驱动LED数码管?

不脱发的程序猿

少儿编程 DIY 创客开发 LED数码管

[ Golang 中的 DDD 实践] 仓储

baiyutang

golang 领域驱动设计 DDD 10月月更

css3中的3D转换效果有哪些,浏览器私有前缀兼容写法

你好bk

html5 css3 大前端 html/css

【Vuex 源码学习】第十一篇 - Vuex 插件的开发

Brave

源码 vuex 10月月更

Vue进阶(幺叁贰):ES实现数组合并

No Silver Bullet

Vue 数组合并 10月月更

Cobar提出的一种在分库场景下对Order By / Limit 的优化

捉虫大师

算法 cobar

如何基于Jupyter notebook搭建Spark集群开发环境

华为云开发者联盟

spark Jupyter Notebook 集群 Spark集群 Sparkmagic

政企融合商城,运营商打开B端市场利器

鲸品堂

运营商

5G NR 网络类型移动开发小记

阿里巴巴终端技术

ios android 5G 移动开发 移动网络

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