阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

C#特性: 只读本地变量

  • 2017-05-04
  • 本文字数:882 字

    阅读完需:约 3 分钟

就在不久之前,只读本地变量提案被重新提上了议程。这一功能相对只读引用提案来说更加温和,并与之形成了互补。

设置只读本地变量的基本语法并不复杂,只需在类型前添加 readonly 关键字即可。这和字段上的 readonly 用法并无二致。你也可以为参数添加 readonly 关键字。

你可以便捷地使用 let 来替代 readonly var。关键字 let 的选取有以下几点原因:

  • 它仅仅是 C# LINQ 表达式的一个关键字,用来定义只读范围变量

  • 它同时也是 F#(以及其他编程语言)的关键字,用来声明只读本地变量

  • 它比另一个相同用途的热门关键字 val 看上去更一目了然。

人们在阅读代码时看到这一基本用法就会明白本地变量一旦设置之后就不能再更改了。

该提案指出,在采用匿名或者异步函数时,利用上述特性有助于编写防御式代码。一种常见的错误是在本地变量之上创建一个闭包,然后将其传到另一个线程中去。这会导致难以察觉的竞争条件。因为大多数开发者并不认为本地变量也可能会导致竞争条件。通过将变量标识为只读,编译器会阻止闭包对该变量再次赋值。

你无法将只读变量以引用或者出参的方式传入函数中。不过在该提案实施之后,你能以只读引用参数的方式来传递变量。

警告:如果将结构体声明为只读的本地变量或是参数的话,那么调用其方法时,编译器会隐式创建一份拷贝。对于一些诸如整型这样的小型结构体来说,这不算什么。但对于大型结构体来说,拷贝的成本不容小觑,可能会带来问题。详情请参见只读引用提案中的“只读结构体”。

悬而未决的设计问题

对于 readonly Type x 是否要像 let x 那样需要立即赋值这一点仍有待探讨。

支持方认为要求在声明时就进行赋值可以让人们知道赋值的具体内容。此外,整个提案也会变得更加简单。

持反方则认为这会影响可读性。编程过程中经常使用的条件表达式会使得代码难以阅读,而且立即赋值也无法在 try-catch 代码块中使用。

更多信息

查看英文原文 C# Futures: Read-Only Local Variables


感谢冬雨对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-05-04 19:001579

评论

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

体育赛事直播平台,为何能成为2024的一匹黑马

软件开发-梦幻运营部

DAPP去中心化交易质押分红系统开发模式案例

l8l259l3365

独立站的SEO优化:提升网站排名的秘诀

技术冰糖葫芦

API 接口

2024上海国际光纤光缆光通信展览会

吹吹晚风

计算机研0该卷大模型还是自学研发呢?

算法的秘密

内含资料下载丨黄东旭:2024 现代应用开发关键趋势——降低成本、简化架构

PingCAP

数据库 TiDB AI技术 应用开发

低代码与智慧工地:助力建筑行业数字化转型

不在线第一只蜗牛

低代码 数字化 数字转型

Golang模糊测试实践

俞凡

golang 模糊测试

2024中国云计算大分野:重回当年,还是走向未来?

脑极体

云计算

面试官:说说SSO单点登录的实现原理?

不在线第一只蜗牛

程序员 面试 SSO 单点登录

架构决策系列1:通用模型or专用模型

agnostic

模型设计 架构决策

低代码数智赋能医药行业:开启医药产业数字化转型新篇章

EquatorCoco

低代码 数智化 数智转型 医药行业

“离开”还是“拓展”你的舒适区

Bruce Talk

VUCA 舒适区 反脆弱

迷茫在森林中

少油少糖八分饱

读书 青春 爱情故事 村上春树 挪威的森林

Uber/Google Golang编码标准深度分析

俞凡

golang 最佳实践

十行代码开发一个AI应用

快乐非自愿限量之名

人工智能 应用开发

在Avalonia项目中使用MediatR和MS.DI库实现事件驱动通信

沙漠尽头的狼

AmzTrends x TiDB Serverless:通过云原生改造实现全局成本降低 80%

PingCAP

数据库 数据分析 云原生 TiDB

Vue3中的Hooks详解

秃头小帅oi

今天来聊聊Java的基本特性

伤感汤姆布利柏

机器学习:解析未来的数据世界

快乐非自愿限量之名

Programming Abstractions in C阅读笔记:p308-p311

codists

CSM是什么意思?

源字节1号

软件开发 前端开发 后端开发 小程序开发

Programming Abstractions in C阅读笔记:p312-p326

codists

算法与数据结构

小红书笔记详情API:为开发者开启的新世界大门

技术冰糖葫芦

API 接口 API】

2024上海国际非金属材料技术应用展览会

吹吹晚风

已解决org.springframework.web.multipart.MultipartException处理多部分请求异常的正确解决方法,亲测有效!!!

小明Java问道之路

文心一言 VS 讯飞星火 VS chatgpt (206)-- 算法导论15.4 3题

福大大架构师每日一题

福大大架构师每日一题

2024上海国际高性能陶瓷及粉体工业展览会

吹吹晚风

如何防止 Elasticsearch 服务 OOM ?

极限实验室

ES console Gateway easysearch

为什么说 TiDB 在线扩容对业务几乎没有影响

PingCAP

数据库 TiDB TiKV

C#特性: 只读本地变量_.NET_Jonathan Allen_InfoQ精选文章