智能体刷屏的背后,是 AI 应用拐点的来临?AICon 北京站议程重磅公布,50+ 硬核分享不容错过 了解详情
写点什么

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

评论

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

Java Web(十)Filter和Listener

浅辄

javaWeb filter listener 11月月更

可防离职员工冒用身份,合合信息名片全能王与钉钉用数字名片打造安全“围栏”

合合技术团队

人工智能 大数据 钉钉 合合信息 名片

Apache EventMesh事件驱动分布式运行时

EventMesh布道师

Serverless Faas EDA workflow eventmesh

经常被问到的react-router实现原理详解

夏天的味道123

React

高频量化合约对冲交易软件开发源代码

开发微hkkf5566

详解React的Transition工作原理原理

夏天的味道123

React

[力扣] 剑指 Offer 第一天 - 包含min函数的栈

陈明勇

Go 数据结构与算法 力扣 11月月更

Java Web(十一)Ajax&Axios&JSON

浅辄

json ajax javaWeb axios 11月月更

深度探讨react-hooks实现原理

xiaofeng

React

国产数据库肇始之独具特色的场景需求

亚信AntDB数据库

数据库 AntDB 国产数据库 AntDB数据库

深度剖析React懒加载原理

xiaofeng

React

python小知识-python 文件操作

AIWeker

Python python小知识 11月月更

龙蜥理事长马涛荣获 “2022 年度开源人物”

OpenAnolis小助手

开源 操作系统 龙蜥社区 理事长 2022云栖大会

CANN 6.0来了,硬核技术抢先看

华为云开发者联盟

人工智能 华为云 昇腾 CANN 6.0

白嫖一款免费的GIF录制软件,好用到飞起,萌新小白装机必备。

bug菌

GIF gif录制 视频录制

webpack高级配置

Geek_02d948

webpack

一文彻底读懂webpack常用配置

Geek_02d948

webpack

详细解读 React useCallback & useMemo

夏天的味道123

React

启科量子 QuSprout 或将启动开源计划

启科量子开发者官方号

人工智能 框架 算力 超算 #量子计算

商业智能工具BI口碑解读:Quick BI为何连续入选魔力象限?

夏日星河

细说React组件性能优化

xiaofeng

React

webpack配置完全指南

Geek_02d948

webpack

python小知识-模块

AIWeker

Python python小知识 11月月更

OpenHarmony集成OCR三方库实现文字提取

OpenHarmony开发者

OpenHarmony

软件测试丨测试大咖漫谈如何搞定软件质量?

测试人

软件测试 软件质量 自动化测试 测试开发

wallys-WiFi-5-outdoor-Access-point-IPQ4019/4029-industrial wireless AP

Cindy-wallys

IPQ4019 ipq4029

Prometheus 监测 RocketMQ 最佳实践

Apache RocketMQ

RocketMQ #java #运维 消息序列

大麦 Android 选座场景性能优化全解析

阿里巴巴终端技术

android 性能优化 客户端

5.图学习【参考资料2】-知识补充与node2vec代码注解

汀丶人工智能

图神经网络 11月月更

李白:你的模型权重很不错,可惜被我没收了

OneFlow

人工智能 深度学习 模型

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