写点什么

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:001749

评论

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

1024茶思屋直播|TinyEngine跨端实践​:可视化搭建导出鸿蒙ArkTs应用

OpenTiny社区

低代码 OpenTiny 前端开源

揭秘 IT 成熟度模型:助力企业在数字时代脱颖而出的战略工具

跟YY哥学Jira

ITSM Gartner 成熟度模型

项目管理这些问题,你是不是忍了很久?

天津汇柏科技有限公司

项目管理 低代码开发 软件定制开发

糟糕,当我上班用deepin,被老板看到了我的桌面后......!

nn-30

Linux 操作系统 deepin 桌面应用 桌面

专业视频编辑软件Final Cut Pro for Mac

Mac相关知识分享

视频编辑软件

易于使用的视频下载工具Downie 4 for Mac

Mac相关知识分享

视频下载工具

Android File Transfer for mac(强大的安卓文件传输工具)

Mac相关知识分享

CST软件如何选择时域求解器的频率范围

思茂信息

仿真软件 cst 电磁仿真

鸿蒙网络编程系列28-服务端证书锁定防范中间人攻击示例

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

好用的运维安全审计系统需满足哪些要求或者诉求?

行云管家

运维 安全运维 运维审计

公开课 | AI赋能自动化测试:解锁未来测试新篇章

测试人

人工智能 软件测试

2024年西藏等保测评机构名单汇总

行云管家

等保 等保测评 西藏

要低代码,但不要低能力,低代码产品能否成为企业的增效神器?

优秀

低代码 低代码平台 低代码平台比较

远程桌面控制软件Microsoft Remote Desktop for Mac

Mac相关知识分享

桌面控制软件

一小时内,构建出属于你自己的 Perplexity AI 搜索引擎

智领云科技

开源 实操 Python 代码 Perplexity AI 搜索引擎

Altair官方文档——HyperMesh模型管理

智造软件

教程 CAE软件 altair Hypermesh

数据驱动未来:淘宝商品详情API在电商实战中的实时监控力量

代码忍者

API 接口 pinduoduo API

BOE(京东方)携手雷神联合发布全球首款仿生蜂鸟屏 以全新升级ACR技术引领显示产业高端化的升维发展

科技汇

矢量编辑工具Sketch for mac(矢量绘图软件)

Mac相关知识分享

PDF专业制作与编辑软件Acrobat Pro DC 2021 for Mac

Mac相关知识分享

PDF编辑软件

CNCC | 倒计时3天!CCF-网易雷火联合基金研讨会:议程嘉宾交通参会指南一图掌握

网易伏羲

人工智能 网易伏羲 cncc 具身智能 群体智能

阿里大牛纯手打“亿级高并发系统设计手册”(限时开源)

架构师之道

高并发 java面试

Photoshop 2020 for Mac(PS 2020)

Mac相关知识分享

ps

全域旅游平台(源码+文档+部署+讲解)

深圳亥时科技

Xmind for Mac(思维导图软件)中文版

Mac相关知识分享

软件测试学习笔记丨Selenium学习笔记:元素定位与操作

测试人

软件测试

智联招聘×Milvus:向量召回技术提升招聘匹配效率

Zilliz

人工智能 AI Milvus Zilliz 向量数据库

火山引擎数智平台VeDI荣获2024爱分析·数据智能优秀厂商奖

字节跳动数据平台

大数据 数据飞轮

Microsoft 365 for Mac(原Office 365)

Mac相关知识分享

办公软件

MariaDB 和 GreatSQL 性能差异背后的真相

GreatSQL

数据为王,实时监控显神威 —— 淘宝商品详情API的电商实战应用

技术冰糖葫芦

API 接口 API 文档 API 测试 pinduoduo API

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