自 2003 年以来,Microsoft 首次考虑对 C# 使用带小数点后位数的版本。当前暂定下一个版本是 C# 7.1,其中有望包括:异步 Main 函数(Async Main)、默认表达式(Default Expression)、推导元组名(Infer Tuple Names)和使用泛型的模式匹配(Pattern-matching with Generics)等。
最让测试异步代码的开发人员沮丧的,无疑是控制台应用当前不支持异步入口点(EntryPoint)。虽然变通方法是编写多行样板代码,但是这样的模式依赖于对方法的非正常使用,难于理解。例如:
- ublic static void Main()
- {
- MainAsync().GetAwaiter().GetResult();
- }
- private static async Task MainAsync()
- {
- ... // 程序主代码。
- }
为解决这个问题,在 "异步 Main 函数建议" 中,添加了如下四个新的函数签名,罗列了可能的入口点。
- static Task Main()
- static TaskMain()
- static Task Main(string[])
- static Task
- Main(string[])
如果代码中不存在另一个非异步 Main 函数,那么只要给出一个上述的入口点函数,编译器就会生成所需的样板代码。唯一的限制是需要向后兼容。
Microsoft 曾考虑允许 "async void Main()",但是这种做法会使编译器更复杂,并且 Microsoft 总体上并不鼓励在事件处理器之外使用 "async void"。
VB 没有表示 "null" 的关键字,这是 C# 和 VB 间的一个微妙的差别。但是 VB 有一个关键字 "Nothing"。在 语言技术规范 中,对该关键字给出了如下说明:
Nothing 是一个特殊的常值。它没有类型,可转换为类型系统中的任意类型,也包括类型参数。在转换为某个特定类型后,它等价于该类型的默认值。
C# 当前使用 "default(T)" 模式实现同一效果,但略为繁琐,尤其是类的名字很长时。C# 7.1 中将提供一个 "默认常值"(Default Literal),其描述为:
这一类型的表达式可通过常值转换为默认值或 null 值,隐式地转换为 any 类型。
该类型向默认常值的推理与向 null 常值推理的工作机制一样,除非允许 any 类型(不只是引用类型)。
在可以使用 null 的地方,通常也可以使用默认常值。这一做法被看成是 C# 建议中的一个倒退,可能因为人们通常会对两个非常类似的方法完成同一件事大皱眉头。在设计会议纪要中,就有人提出疑问:
我们是否正在挑起类型之争?
一个使用默认常值的例子如下:
- ImmutableArray
- x =
- default;
- return
- default;
- void Method(ImmutableArray
- arrayOpt =
- 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.tuicool.com/articles/77VBbeY