写点什么

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

评论

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

你只修改了2行代码,为什么需要两天时间?

Java架构师迁哥

破51项国际榜单纪录!解读华为云擎天架构调度求解引擎

华为云开发者联盟

华为 架构 华为云

如何在软件发布计划中自动化语义化版本与变更日志

华为云开发者联盟

自动化 工具 发布

Mybatis是如何解析配置文件的?

田维常

mybatis

XMEX交易所系统软件开发|XMEX交易所APP开发

系统开发

即构SDK12月迭代:新增多项质量回调,互动白板、云录制SDK同步更新

ZEGO即构

LeetCode题解:429. N叉树的层序遍历,BFS,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

BAT等大厂面试复习资料文档整理:ActiveMQ+redis+Spring+高并发多线程+JVM

Java架构之路

Java 程序员 架构 面试 编程语言

BATJ面试常被问到的100+题:Spring+微服务+SpringMVC+MyBatis

Java架构之路

Java 程序员 架构 面试 编程语言

我叫你不要重试,你非得重试。这下玩坏了吧?

比伯

Java 编程 架构 面试 程序人生

快来!开源一份阿里微服务指导手册:springBoot+springCloud+MQ

小Q

学习 面试 微服务 MQ SpringCloud

社区团购大战升级:零售行业再次面临挑战

石头IT视角

Athena雅典娜交易所系统开发|Athena雅典娜交易所软件APP开发

系统开发

海淀区政府携手百度,打造数字政务时代新门户

DT极客

一个改变世界的“箱子”

阿里巴巴云原生

Docker 阿里云 容器 云原生 k8s

聚焦LS-MIMO的四大层面,浅谈5G关键技术

华为云开发者联盟

华为 5G 华为云

有了Git这个功能,再也不需要依赖IDE了!

编程 架构

数据上链,区块链技术平台搭建

t13823115967

数据上链 区块链应用

基于LiteOS Studio零成本学习LiteOS物联网操作系统

华为云开发者联盟

操作系统 物联网 华为云

SpringBoot魔法堂:应用热部署实践与原理浅析

设计原则 框架 spring Boot Starter

手把手教你免费获取正版 Jetbrains 全家桶 License

郭旭东

ide JetBrains

终于有人通过笔记+脑图+视频的模式把Spring源码讲明白了

Java架构追梦

Java 学习 架构 面试 spring源码

网络入门模拟器:Cisco Packet Tracer 实验教程

盘点 2020 | 坚持写技术博客一年能有多少收获!

小傅哥

Java 小傅哥 技术人 盘点2020

没弄懂这些Java基础,简历上千万别写熟悉:异常+反射+注解+泛型

小Q

Java 学习 编程 面试 基础

阿里三面惨遭被虐,spring,jvm,mybatis,并发编程等一窍不通

Java架构之路

Java 程序员 架构 面试 编程语言

赶紧看!阿里架构师必备“绝杀版”Tomact架构笔记堪称绝技

比伯

Java tomcat 编程 架构 程序人生

终于学完了阿里云大数据架构师推荐的Flink入门与实战PDF

小Q

大数据 flink 学习 编程 面试

工作日志:一文总结HBase从搭建到实操,大家一起进步

小Q

大数据 学习 编程 面试 HBase

互联网新规鼓励保险与大数据、区块链等新技术融合!业内呼吁配套产品管理制度尽快出炉

CECBC

互联网金融

《构建高性能WEB站点》.pdf

田维常

架构

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