阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

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

评论

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

Java 后端 100多道面试题,多看点题,没坏处!

钟奕礼

Java 程序员 java面试 java编程

2022成功入职阿里:阿里的三套Java研发岗面试题总结(文末有答案)

钟奕礼

Java java面试 java编程 程序员、

阿里、百度、美团、面试题大集合,愿你更轻松拿下大厂offer

钟奕礼

Java java面试 java编程 程序员、

拿下大厂?这几道jvm面试题必须要懂

钟奕礼

Java 程序员 java面试 java编程

三到五年互联网公司Java面试题大全

钟奕礼

Java 程序员 java面试 java编程

2022一线大厂10w字面试总结,每日刷几道,明年金三银四稳了

程序员小毕

spring 程序员 JVM 架构师 java面试

Java中的String类常用方法

共饮一杯无

Java string 11月月更

网络核心笔记(一)

lxmoe

学习笔记 网络 11月月更

如何召回流失用户

穿过生命散发芬芳

11月月更 流失召回

霸榜巨作!阿里内部顶级大佬整理(Redis 5设计与源码分析)

钟奕礼

Java 程序员 java面试 java编程

3年Java研发,突击30天,从14K变成了30K

程序知音

Java java面试 大厂面试 java架构 后端技术

这20道微服务面试题,阿里、字节、美团、百度面试都问了

钟奕礼

Java 程序员 java面试 java编程

网络核心笔记(二)

lxmoe

学习笔记 网络 11月月更

【C语言】int 关键字

謓泽

11月月更

Python冷知识:如何找出新版本增加或删除了哪些标准库?

Python猫

Python

一文搞懂MySQL表字段类型长度的含义

海风极客

MySQL 数据库 11月月更

仅hashmap一道面试题我就搞定了面试官成功入职面试官:我裂开了

钟奕礼

Java java面试 java编程 程序员、

CleanMyMac2023Mac系统电脑磁盘优化软件

茶色酒

CleanMyMac CleanMyMac2023

Java | IO流缓冲流和转换流

陌上

Java 编程 11月月更

Python进阶(五十三)Flask Web开发实现将表单渲染成HTML

No Silver Bullet

Python flask web开发 11月月更

从基础到实战,阿里巴巴高并发系统设计全彩版手册限时开源

Java全栈架构师

程序员 面试 程序员人生 高并发 架构师

8年Java开发含泪刷题,架构岗现在好难进,有点崩溃

钟奕礼

Java 程序员 java面试 java编程

这个bug,你中招了吗!!!

石臻臻的杂货铺

kafka 后端 11月月更

2022全网最全最新Java面试题-独家内部教材

钟奕礼

Java 程序员 java面试 java编程

GitHub标星75k,阿里15W字的Spring高级文档(全彩版),真的太香了

程序知音

Java spring ssm java架构 后端技术

【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「Logback-MDC篇」

洛神灬殇

log4j logback 全链路追踪 11月日更 MDC

面试中如何才能拿到阿里 P7 的职级?

Java永远的神

Java 阿里巴巴 程序员 架构师 程序员晋升

集合工具类Collections指南,以及Comparable和Comparator排序详解

共饮一杯无

Java 集合 11月月更

亿级万物互联新时代的物联网消息中间件EMQX调研

宋小生

物联网 mqtt emqx

2022年华为Java面经,还没搞懂JVM

钟奕礼

Java 程序员 Java 面试 java编程

Java | IO流数据流和标准输出流

陌上

Java 编程 11月月更

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