BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

C#特性: 只读本地变量

| 作者 Jonathan Allen 关注 595 他的粉丝 ,译者 汪佳南 关注 0 他的粉丝 发布于 2017年5月5日. 估计阅读时间: 2 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

就在不久之前,只读本地变量提案被重新提上了议程。这一功能相对只读引用提案来说更加温和,并与之形成了互补。

设置只读本地变量的基本语法并不复杂,只需在类型前添加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)关注我们。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT