HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

评论

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

Prometheus 中 histogram_quantile 函数相关的若干问题

TiDB 社区干货传送门

监控

悲观事务死锁检测

TiDB 社区干货传送门

TiDB 底层架构

TiDB 5.0 在TPCH和SSB基准测试下OLAP方面的能力表现

TiDB 社区干货传送门

版本测评

高可用测试:KILL TiKV-Server,事务 TPS 掉零现象解读

TiDB 社区干货传送门

在x86和arm混合部署架构下排查TiKV节点内存占用极高的问题

TiDB 社区干货传送门

性能调优 故障排查/诊断

【案例】汽车之家 - 一次业务优化解决读写冲突的案例,提升 5 倍性能

TiDB 社区干货传送门

性能调优

tikv下线Pending Offline卡住排查思路

TiDB 社区干货传送门

故障排查/诊断

数据库架构升级选型 - TiDB

TiDB 社区干货传送门

数据库架构选型

TiDB 5.0 部分新特性试用

TiDB 社区干货传送门

版本测评 新版本/特性发布 性能测评

TiKV 多副本丢失以及修复实践

TiDB 社区干货传送门

实践案例

TiDB 性能优化实践

TiDB 社区干货传送门

性能调优 性能测评

TiKV 多副本丢失的故障修复演练

TiDB 社区干货传送门

故障排查/诊断

TiDB 在 OPPO 准实时数据仓库中的实践

TiDB 社区干货传送门

实践案例

陆金所金融核心场景数据库的去 O 之路

TiDB 社区干货传送门

实践案例

数字化转型背后的 TiDB(地产行业)

TiDB 社区干货传送门

实践案例

血泪教训 TiKV多副本丢失unsafe-recover恢复记录

TiDB 社区干货传送门

故障排查/诊断

PD 客户端源码分析

TiDB 社区干货传送门

安装 & 部署

网易游戏 Flink on TiDB 实时数据业务实践

TiDB 社区干货传送门

实践案例

TiDB大规模节点下线实践

TiDB 社区干货传送门

性能调优

TiDB 5.0 VS MySQL 8.0 性能对比测试

TiDB 社区干货传送门

版本测评

TiDB 海量 region 集群调优实践

TiDB 社区干货传送门

性能调优 管理与运维

这么多TiDB负载均衡方案总有一款适合你

TiDB 社区干货传送门

实践案例 管理与运维

浅谈 TiDB 初始化系统库过程

TiDB 社区干货传送门

性能调优 TiDB 底层架构

使用Zabbix监控TiDB(二)

TiDB 社区干货传送门

监控

TiDB集群之中控不可用,怎么办?

TiDB 社区干货传送门

管理与运维 故障排查/诊断

TiDB 5.2 发版 ——“交易+分析”双引擎提速,挑战极限业务场景

TiDB 社区干货传送门

新版本/特性发布

TiDB备份实现

TiDB 社区干货传送门

管理与运维

TiUP cluster 用到的三个账户

TiDB 社区干货传送门

安装 & 部署

PD 三类选主流程梳理

TiDB 社区干货传送门

TiDB 底层架构

【喜大普奔】zabbix 能监控 tidb 集群了 && tidb 能存储 zabbix 监控数据了

TiDB 社区干货传送门

监控

如何理解TiDB允许广义上的幻读

TiDB 社区干货传送门

TiDB 底层架构

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