自2003年以来,Microsoft首次考虑对C#使用带小数点后位数的版本。当前暂定下一个版本是C# 7.1,其中有望包括:异步Main函数(Async Main)、默认表达式(Default Expression)、推导元组名(Infer Tuple Names)和使用泛型的模式匹配(Pattern-matching with Generics)等。

异步Main函数

最让测试异步代码的开发人员沮丧的,无疑是控制台应用当前不支持异步入口点(EntryPoint)。虽然变通方法是编写多行样板代码,但是这样的模式依赖于对方法的非正常使用,难于理解。例如:

ublic static void Main()
{MainAsync().GetAwaiter().GetResult();
}
private static async Task MainAsync()
{... // 程序主代码。
}

为解决这个问题,在“异步Main函数建议”中,添加了如下四个新的函数签名,罗列了可能的入口点。

static Task Main()
static TaskMain()
static Task Main(string[])
static TaskMain(string[]) 

如果代码中不存在另一个非异步Main函数,那么只要给出一个上述的入口点函数,编译器就会生成所需的样板代码。唯一的限制是需要向后兼容。

Microsoft曾考虑允许“async void Main()”,但是这种做法会使编译器更复杂,并且Microsoft总体上并不鼓励在事件处理器之外使用“async void”。

默认值(即Nothing)

VB没有表示“null”的关键字,这是C#和VB间的一个微妙的差别。但是VB有一个关键字“Nothing”。在语言技术规范中,对该关键字给出了如下说明:

Nothing是一个特殊的常值。它没有类型,可转换为类型系统中的任意类型,也包括类型参数。在转换为某个特定类型后,它等价于该类型的默认值。

C#当前使用“default(T)”模式实现同一效果,但略为繁琐,尤其是类的名字很长时。C# 7.1中将提供一个“默认常值”(Default Literal),其描述为:

这一类型的表达式可通过常值转换为默认值或null值,隐式地转换为any类型。

该类型向默认常值的推理与向null常值推理的工作机制一样,除非允许any类型(不只是引用类型)。

在可以使用null的地方,通常也可以使用默认常值。这一做法被看成是C#建议中的一个倒退,可能因为人们通常会对两个非常类似的方法完成同一件事大皱眉头。在设计会议纪要中,就有人提出疑问:

我们是否正在挑起类型之争?

一个使用默认常值的例子如下:

ImmutableArrayx = default;
return default;
void Method(ImmutableArrayarrayOpt = default) var x = new[] { default, ImmutableArray.Create(y) }; const int x = default; if (x == default) if (x is default) y = default as RefType //编译器告警:总是null。 int i = default 

下面例子给出的是对默认常值的非法使用:

const int? y = default;
if (default == default)
if (default is T)
var i = default
throw default

后者无疑是一个C#设计上的奇特构件。在设计会议纪要中,给出了如下说法:

在C#中,允许开发人员抛出null。这会引发一个运行时错误,进而导致抛出一个NullReferenceException异常。因此,抛出NullReferenceException并非正大光明的,而是一种丑陋的模式。

完全没有理由允许抛出默认值。我们并不认为用户会感觉这是可行的,或是了解它的工作机制。

Microsoft并未引入默认常值,而是考虑通过扩展“null”实现同一效果。因为在VB中“nothing”和“null”是两个不同的关键词,所以在VB中可以这样做。即使不使用关键字,VB中也具有null的概念。因此,开发人员可以看到“NothingReferenceException”这样的异常。

在C#中,开发人员可能常会有这样的一个疑问:“null是否表示的是实际的空值,或是表示了可能为空值也可能不为空值的默认值?”我们认为,这是一个令人非常困惑的问题。

在本文的第二部分中,我们将介绍元组和模式匹配。

原文地址:http://www.infoq.com/cn/news/2017/06/CSharp-7.1-a


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

C# 7.1先睹为快(第一部分)相关推荐

  1. Python深度学习篇

    Python深度学习篇一<什么是深度学习> Excerpt 在过去的几年里,人工智能(AI)一直是媒体大肆炒作的热点话题.机器学习.深度学习 和人工智能都出现在不计其数的文章中,而这些文章 ...

  2. 《Python编程》第一章:先睹为快

    一.<Python编程>的第一章综述 主要从数据(记录)的表示出发,讲述数据(记录)存储(内存.pickle.shelves),包括:格式化.持久化.图形化(GUI,tkinter).控制 ...

  3. mysql文件系统_mysql文件系统先睹为快

    mysql文件系统先睹为快(目录) 这是一款正在开发中的linux 文件系统,能把linux 上的mysql 数据库作为文件系统来处理.开发小组希望能得到更多的建议,下面的文章翻译自: http:// ...

  4. Visual Studio 15.5预览版先睹为快

    Microsoft延续了Visual Studio 2017快速迭代开发的步伐,最新发布了15.5预览版,这是VS2017这一广受欢迎的IDE自发布以来的第五次更新,该预览版的发布使用户可以先睹为快. ...

  5. GitHub Trending第一之后,PaddleOCR再发大招:百度自研顶会SOTA算法正式开源!

    要说生活里最常见.最便民的AI应用技术,OCR(Optical Character Recognition,光学字符识别)当属其中之一.寻常到日常办理各种业务时的身份证识别,前沿到自动驾驶车辆的路牌识 ...

  6. 宇宙第一 IDE Visual Studio 支持 Java 了!

    惊不惊喜?意不意外? 作者 | 唐小引 出品 | CSDN(ID:CSDNNews) 北京时间 10 月 25 日 - 27 日,2018 微软技术暨生态大会(Microsoft Tech Summi ...

  7. Android看韩漫软件,第一韩漫app-第一韩漫安卓版v1.0

    第一韩漫是人气很高的专门看韩漫的软件,实时为你更新推送漫画资源,让你不会漫荒,享受看漫画的过程.第一韩漫保证所有资源都是免费提供的,不会占用你很多内存,想看多久就看多久,喜欢的朋友可以点击下载! 第一 ...

  8. 在Elasticsearch中实现统计异常检测器——第一部分

    Implementing a Statistical Anomaly Detector in Elasticsearch - Part 1 该图显示了4500万个数据点的最小/最大/平均值(超过600 ...

  9. Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几

    Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...

最新文章

  1. 《大数据、小数据、无数据:网络世界的数据学术》一 导读
  2. 拔掉网线时Socket的检查方法
  3. 微服务API设计的实践与思考总结
  4. VC/MFC列表CListCtrl类的LVCOLUMN和LVITEM详解
  5. 希尔排序听起来有点难,其实很简单
  6. Bert在CV领域的应用
  7. python 中del 的用法
  8. Python批量爬取名字中带有中文的pdf文件
  9. Yii 2 修改 URL 模式为 PATH 模式,并隐藏index.php
  10. 语言怎么得到直流电压并采样_250V10A高频直流电源/大电流直流稳压稳流电源
  11. matplotlib绘制李萨如图(三) 静态3D李萨如图
  12. 实时 摔倒识别 /运动分析/打架等异常行为识别/控制手势识别等所有行为识别全家桶 原理 + 代码 + 数据+ 模型 开源!
  13. PHP进销存源码 ERP多仓库管理系统带小程序,前端采用原生uniapp
  14. 平面设计个人简历模板
  15. 基于Android的人脸门禁系统
  16. 互联网时代,传统企业如何做引流拓客?
  17. R forcast auto arima用法
  18. 信息安全工程师(软考中级)
  19. 此前小编为大家介绍了女人吃鸡蛋的好处,想必大家对鸡蛋这种蛋类有了更多的了解。今天小编为大家介绍另一种蛋类——鸭蛋。鸭蛋又名鸭卵,是人们经常食用的一种蛋类食品,与鸡蛋营养相当,吃它的好处众多。那么女人吃
  20. PostgreSQL 12 中文文档

热门文章

  1. zabbix邮件发不出去
  2. Centos6.5使用ELK(Elasticsearch + Logstash + Kibana) 搭建日志集中分析平台实践
  3. RPC调用框架比较分析
  4. ISA禁止了symantec的LiveUpdate的使用
  5. HP产品选件查询网站
  6. 特斯拉为何使用.NET 技术栈?
  7. 4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2
  8. 使用Redis set 解决数据的唯一性问题
  9. 使用identity+jwt保护你的webapi(三)——refresh token
  10. 【干货】单日10亿GMV的.NET5电商平台,是如何设计的?