[译]C# 7系列,Part 4: Discards 弃元
原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/27/c-7-series-part-4-discards/
有时我们想要忽略一个方法返回的值,特别是那些out参数,一个典型的例子是检查一个字符串是否可以解析成另一种类型:
bool parsedValue;
if (bool.TryParse("TRUE", out parsedValue)) { /* 其他代码 */ }
这里我们要忽略parsedValue。我们还希望使这个变量不可访问,以便开发人员不能引用它。
C# 7.0有一个叫做discards(译注:官方翻译:弃元)的新特性,可以在这个场景中用来实现我们的目标。
弃元
弃元是可以赋值但不能从中读取的局部变量。也就是说,它们是“只写”的局部变量。它们没有名称,而是用_(下划线)表示。_是上下文关键字,与var非常相似,并且_不能被读取(即不能出现在赋值的右侧)。
如果我们将弃元应用到上面的代码,它将看起来像这样:
if (bool.TryParse("TRUE", out bool _)) { /* 其他代码 */ }
因为_是不可读的,所以它不会出现在IDE的智能感知中,也不会编译代码。
弃元适用的场景
- 带有out修饰符的声明表达式,例如:bool.TryParse(“字符串”,out _)
- 模式匹配子句,例如case int _ 或 if (x is string _)
- 解构:
- 在声明中:如var (a, _, c) = myObj
- 在赋值:如var a, b;(a, b, _) = myObj
- 值元组解构:例如 var (a, _, _) = (1,2,3)
关键字_
请始终记住_是一个上下文相关的关键字,就像var一样,这意味着如果您已经在当前上下文中声明了一个局部变量_,并且它位于作用域中,那么_将不是一个弃元,而是会在作用域中引用该局部变量。
更有趣的是,看看下面的代码:
bool _ = false, v = false;
if (bool.TryParse("TRUE", out var _))
{
v = _;
}
v的值是多少?
答案是false。if的条件为真,因为字符串“true”可以解析为一个布尔值true,但是这里我们用了out var _,这覆盖了前面声明的变量_的作用域,它是一个弃元。然后,if语句中的赋值v = _只读取前面声明的局部变量_的值(为false),并赋值给v,因此v的值为false。如果我们删除var来将代码更改为out _,那么v的值将为true,因为_不再是一个弃元了(译注:是一个普通变量),并且它保存了解析后的布尔值。
结论
C#中的弃元允许忽略一些局部变量。这是一个设计时特性,运行时可能仍然需要这个局部变量,编译器也可能为它生成一个名称。因为_关键字是上下文关键字,所以你需要设置一个编码策略来避免使用_作为名称声明局部变量以减少混淆。这个特性与早期的.NET版本兼容,因为它不需要更改CLR。
系列文章:
- [译]C# 7系列,Part 1: Value Tuples 值元组
- [译]C# 7系列,Part 2: Async Main 异步Main方法
- [译]C# 7系列,Part 3: Default Literals 默认文本表达式
- [译]C# 7系列,Part 4: Discards 弃元 (本文)
- [译]C# 7系列,Part 5: private protected 访问修饰符
- [译]C# 7系列,Part 6: Read-only structs 只读结构
- [译]C# 7系列,Part 7: ref Returns ref返回结果
- [译]C# 7系列,Part 8: in Parameters in参数
- [译]C# 7系列,Part 9: ref structs ref结构
- [译]C# 7系列,Part 10: Span<T> and universal memory management Span<T>和统一内存管理 (完)
[译]C# 7系列,Part 4: Discards 弃元的更多相关文章
- [译]C# 7系列,Part 9: ref structs ref结构
原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/02/c-7-series-part-9-ref-structs/ 背景 在之前的文章中,我解释了 ...
- [译]C# 7系列,Part 8: in Parameters in参数
原文:https://blogs.msdn.microsoft.com/mazhou/2018/01/08/c-7-series-part-8-in-parameters/ 背景 默认情况下,方法参数 ...
- [译]C# 7系列,Part 1: Value Tuples 值元组
Mark Zhou写了很不错的一系列介绍C# 7的文章,虽然是2年多年前发布的,不过对于不熟悉C# 7特性的同学来说,仍然有很高的阅读价值. 原文:https://blogs.msdn.microso ...
- [译]C# 7系列,Part 2: Async Main 异步Main方法
原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/ 你大概知道,C#语言可以构建两种 ...
- [译]C# 7系列,Part 3: Default Literals 默认文本表达式
原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/06/c-7-series-part-3-default-literals/ C#的default ...
- [译]C# 7系列,Part 5: private protected 访问修饰符
原文:https://blogs.msdn.microsoft.com/mazhou/2017/10/05/c-7-series-part-5-private-protected/ C#有几个可访问性 ...
- [译]C# 7系列,Part 6: Read-only structs 只读结构
原文:https://blogs.msdn.microsoft.com/mazhou/2017/11/21/c-7-series-part-6-read-only-structs/ 背景 在.NET世 ...
- [译]C# 7系列,Part 7: ref Returns ref返回结果
原文:https://blogs.msdn.microsoft.com/mazhou/2017/12/12/c-7-series-part-7-ref-returns/ 背景 有两种方法可以将一个值传 ...
- [译]C# 7系列,Part 10: Span<T> and universal memory management Span<T>和统一内存管理
原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/25/c-7-series-part-10-spant-and-universal-memory- ...
随机推荐
- KubeCon 2019 北美会议完美落幕 | 云原生生态周报 Vol. 29
作者 | 陈俊.张晓宇.徐迪 业界要闻 KubeCon 2019 北美会议召开 业界最隆重的盛会 KubeCon+CloudNativeCon 今年在圣地亚哥举办,超过 12000 名参会者以及 10 ...
- 新闻实时分析系统 基于IDEA环境下的Spark2.X程序开发
1.Windows开发环境配置与安装 下载IDEA并安装,可以百度一下免费文档. 2.IDEA Maven工程创建与配置 1)配置maven 2)新建Project项目 3)选择maven骨架 4)创 ...
- mysql数据库终端上的增删改查及权限等相关操作
ctrl + c 终止 [linux] service mysql start 启动mysql service mysql stop 停止mysql service mysql restart 重启m ...
- 第五章 Unity中的基础光照(2)
目录 1. Unity中的环境光和自发光 2. 在UnityShader中实现漫反射光照模型 2.1 实践:逐顶点光照 2.2 实践:逐像素光照 2.3 半兰伯特模型 1. Unity中的环境光和自发 ...
- Spring Cloud(二):Eureka 服务注册中心
前言 服务治理 随着业务的发展,微服务应用也随之增加,这些服务的管理和治理会越来越难,并且集群规模.服务位置.服务命名都会发生变化,手动维护的方式极易发生错误或是命名冲突等问题.而服务治理正是为了解决 ...
- WebMagic 实现爬虫入门教程
本示例实现某电影网站最新片源名称列表及详情页下载地址的抓取. webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发. WebMagic 特点: 完全 ...
- The requested profile 'prod' could not be activated because it does not exist.
maven打包时警告:The requested profile 'prod' could not be activated because it does not exist. 需要在pom.xml ...
- css重置样式
<style> html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ...
- 关于非阻塞I/O、多路复用、epoll的杂谈
本文主要是想解答一下这样几个问题: - 什么是非阻塞I/O - 非阻塞I/O和异步I/O的区别 - epoll的工作原理 文件描述符 文件描述符在本文有多次出现,难免有的朋友不太熟悉,有必要简单说明一 ...
- ubuntu下仅仅获取网卡一的ip地址 && shell中字符串拼接
问题描述: ubuntu下仅仅获取网卡一的ip地址 问题背景: eth0,eth1,eth2……代表网卡一,网卡二,网卡三…… lo代表127.0.0.1,即localhost | 问题描述: 已知字 ...