NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

评论

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

直播回顾 | 为什么在开发流程中应用静态代码分析工具?

鉴释

软件开发生命周期 在线研讨会 静态代码分析

价值连城 神经网络- 吴恩达Andrew Ng Coursera Neural Networks and Deep Learning John 易筋 ARTS 打卡 Week 58

John(易筋)

ARTS 打卡计划

香港云服务器的性能提升对行业服务带来显著动力

九河云安全

唯品会三年,我只做了5件事,如今跳槽天猫拿下offer(Java岗)

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

云计算重塑生命科学行业,北鲲云加速生物制药企业转型

北鲲云

2021 营销数字化的下一个站点

人称T客

云原生 | 混沌工程工具 ChaosBlade Operator 入门篇

RadonDB

混沌工程 RadonDB KubeSphere

单元测试:GTest之事件机制(一)

正向成长

测试 测试 单元测试 GTest

全民K歌跨端体系建设

Edwiin

跨端 hippy 全民K歌

IM之Qunar实现

Qunar技术沙龙

架构 IM 办公 客服 消息

沙场秋点兵——MySQL容器化性能测试对比

焱融科技

MySQL 云计算 容器 高性能 分布式存储

真正决定你成败的,是时间管理!

博文视点Broadview

iOS官方瘦身方案ODR(一):初见On-Demand Resources

LabLawliet

ios 独立开发者 优化技巧 Apple Developer 8月日更

一文带你认识LPWA通信技术

华为云开发者联盟

物联网 通信 NB-IoT LPWA SigFox

在 Dubbo3.0 上服务治理的实践

阿里巴巴中间件

云计算 Serverless 云原生 dubbo 中间件

难以置信!一篇文章就梳理清楚了 Python OpenCV 的知识体系

梦想橡皮擦

8月日更

太可惜了,四面字节跳动,我的offer竟被一道“算法题”给拦截了

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

团队对质量负责,“我”可以不负责?

BY林子

敏捷测试 责任流程模型

Camtasia添加弹题交互教程

淋雨

视频剪辑 Camtasia 录屏软件

时序数据库永远的难关 — 时间线膨胀(高基数 Cardinality)问题的解决方案

阿里巴巴中间件

云计算 阿里云 云原生 中间件 时序数据库

亏损、退市、卖身...区块链如何挽救影视行业?

旺链科技

区块链 版权保护 影视行业

太为难我了,阿里面试了7轮(5年经验,拿下P7岗offer)

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

oeasy教您玩转vim - 3 - # 打开文件

o

香港云服务器的火爆市场,下一个未来发展将会怎么改变?

九河云安全

YYDS!浪潮云蝉联中国政务云服务运营市场占有率第一

浪潮云

云计算

使用 PolarDB 和 ECS 搭建门户网站

若尘

阿里云 Polar 8月日更

关于测试的三个关键问题

QualityFocus

测试 质量 测试文化 测试落地

Zilliz 陈室余:音视频相似性检索的技术实现丨ECUG Meetup 回顾

七牛云

AI 音视频 ECUG 七牛云

针对于香港服务器快速威胁检测是加强安全的关键

九河云安全

面向大规模商业系统的数据库设计和实践

百度Geek说

数据库 后端 数据库设计 数字化

基于香港云服务器的解决方案可以增强金融服务公司在降低成本的同时降低风险

九河云安全

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