设为首页 加入收藏

TOP

Build 2018大会:C#的未来
2018-06-04 08:50:47 】 浏览:81
Tags:Build 2018 大会 未来

在C#的未来特性清单上,排在第一位的是可空引用类型。我们第一次报道这个特性是在去年,这里我们简要的回顾一下:所有的引用变量、参数和字段默认都是非空的。然后,和值类型一样,如果你希望它们可以为空,你就必须在类型名上加一个问号(?)来显式说明。


这会是一项可选特性,目前的想法是,对于将升级到C# 8的现有项目,可空引用类型特性是关闭的。对于新项目,微软倾向于默认开启这项特性。


警告会进一步分成潜在错误和表面警告。例如,如果p.MiddleName是一个string?,那么下面这行代码会是一个表面警告:


由于危险只会出现在值解引用的时候,所以这种对局部变量的赋值并不是一个真正的问题。因此,你可以在遗留代码上禁用这个警告,以减少误报数量。


同样,早于这项特性的库也不会触发警告,因为编译器不知道一个指定的参数是否应该视为可空的。


GitHub上提供了可空引用类型的预览


Switch表达式


Switch块通常用于简单地返回单个值。在这个常见的场景中,其语法比实际完成的工作要复杂得多。考虑下下面这个使用模式匹配的例子:


在新的提案中,反复出现的case和return语句可以省掉,其结果是下面这种更新、更紧凑的语法:


具体的语法还在讨论之中。例如,现在还不确定这个特性是要使用=>还是:分割模式表达式和返回值。


Property模式匹配


当前,可以通过when子句执行Property层的模式匹配。


借助“Property模式”,上述代码就简化为:


变化很小,但却让代码更清晰,也去掉了一些冗余的变量名称。


从模式中提取Property


更进一步,你可以在模式中声明变量:


模式中的“解构器(Deconstructor)”


解构器用于把对象解构成其组成部分。它主要用于从元组多重赋值。在C# 7.3中,你还可以把解构器和模式匹配一起使用。


在下面的例子中,Person类被解构成{FirstName, MiddleName, LastName}。由于我们不使用MiddleName,所以我们使用一条下划线来跳过这个属性:


递归模式


下一个模式,假设Student类解构成{FirstName, MiddleName, LastName, Professor}。我们可以同时解构Student对象及其子类Professor对象。


在这行代码中,我们:


GitHub上提供了递归模式匹配的预览


索引表达式


索引表达式消除了在使用类数组数据结构时的大部分冗长(易出错)的语法。


帽子操作符(^)从列表尾部开始计数。例如,要获取字符串的最后一个值可以这样写:


或者简单地写成:


该特性适用于计算值,如:


范围表达式


范围表达式和索引表达式密切相关,用(..)操作符表示。下面是一个简单的例子,获取字符串中的前三个字符:


范围表达式可以结合索引表达式一起使用。在下面这行代码中,我们跳过了第一个和最后一个字符。


范围表达式也适用于Span。


注意,第一个数值包含,第二个数值不包含。因此,变量slice包含元素4、5、6、7。


要获取一个切片,包含从某个索引值往后的所有元素,有两种方法:


类似地,你可以省略第一个索引:


不用觉得奇怪,这个语法主要是受Python启发,主要的区别是C#不能使用-1表示数组末尾索引,因为那在.NET数组中已经有一个意思了。因此,我们使用^1语法代替。


GitHub上提供了索引和范围的预览


IAsyncDisposable


顾名思义,该接口允许对象暴露一个DisposeAsync方法。与此对应的是新语法“using async”,它和普通的using块一样,但增加了等待dispose调用的功能。


异步枚举


和IEnumerable类似,IAsyncEnumerable让你可以枚举一个长度未知的有限列表。不过,配备的枚举器看上去有轻微的差别。它暴露了两个方法:


该接口有一个有趣的特性,就是允许你批量读取数据。你针对批次中的每一个数据项调用TryGetNext方法。当返回success=false时,你可以调用WaitForNextAsync获取一个新的批次。


这之所以重要,是因为大多数进入应用程序的数据要么是按批次,要么是从网络流入。当你调用TryGetNext时,数据大多数时候都已经是可用的。分配一个Task对象有点浪费,除非你用完了输入缓冲区中的数据,并且仍然希望能够异步等待更多数据。


在理想情况下,你不会经常直接使用这些接口。取而代之,微软希望你使用异步迭代器语法“foreach await”,我们去年预览过。它会根据需要处理同步或异步方法的调用。


默认接口方法


这个灵感来自Java、颇具争议的特性仍然被考虑加入C# 8中。简单来说,它让你可以添加新方法及其实现,达到接口演化的目的。这样,新方法不会破坏向后兼容性。


记录


记录是一种快速创建不可变类的语法。我们第一次看到这个提案是在2014年。当前的例子如下:


从根本上说,它完全是一个由构造函数签名定义的类。对于一个不可变类,你想要的所有属性和方法都是自动生成的。


查看英文原文Build 2018: The Future of C#


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇深入理解JVM之Java字节码文件 下一篇Java变量初始化之后的默认值问题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目