原文: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。

系列文章:

最新文章

  1. AJAX 缓存
  2. 4. UIButton的使用
  3. Auty自动化测试框架第六篇——垃圾代码回收、添加suite支持
  4. jQuery-瀑布流-绝对定位布局(二)(延迟AJAX加载图片)
  5. IIS经典模式和集成模式在管道模型中的不同
  6. OC2_数组操作
  7. SQL Cursor(游标)
  8. Spire.XLS
  9. CodeIgniter目录结构
  10. 射频识别技术漫谈(13)——Mifare S50与Mifare S70
  11. 分布式配置管理平台 Disconf
  12. MyBatis学习笔记1--初识MyBatis
  13. Chris Richardson微服务翻译:微服务部署
  14. 遍历Map集合:java.util.Map.Entry、KeySet两种方式
  15. JavaScript 使用闭包防止变量污染
  16. LOJ2083 [NOI2016] 优秀的拆分 【哈希】【调和级数】
  17. angualr跨域访问配置
  18. DataGridView上下键事件获取到的是上次停留行的内容
  19. Linux基础实操一
  20. Codeforces.566E.Restoring Map(构造)

热门文章

  1. Netty-主从Reactor多线程模式的源码实现
  2. kubeadm join 超时报错 error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition
  3. KNN学习笔记
  4. 2019-2020-1 20199304《Linux内核原理与分析》第一周作业
  5. 开发者如何学好 MongoDB
  6. Python-TCP客户端程序开发
  7. pop 与 popitem
  8. luogu P2947 [USACO09MAR]向右看齐Look Up |单调队列
  9. Spring Boot 结合Spring Data结合小项目(增,删,查,模糊查询,分页,排序)
  10. Mybatis_多表关联查询_resultMap_集合对象_N+1方式实现