原文: C# 8.0 Previewed

在一个Channel 9 的视频中,Mads Torgersen展示了C#8的首批四个新特性。

可空引用类型

过去我们报道过可空引用类型,简单地说,默认情况下引用类型将不再能为空。相应的,您必须使用与可空值类型相同的 Type? 语法将其明确标记为可空。

将 null 分配给不可为空的引用类型将得到一个编译器警告。 同样,从可空类型读取也将得到一个编译器警告,除非提前对有问题的变量进行显式检查。 所以理论上开发者需要做的唯一改变是适当情况下加上问号。

自从我们的报告,这个特性添加了一个新的语法。 考虑一种情况,你明知道可空变量x实际上不是空值,但却无法编译器证明。 在这种情况下,可以使用 x!.Method() 来禁止编译器对潜在空引用异常的警告。

异步流 (即 foreach async)

异步流类似于 IEnumerable 的异步方式。 正如我们之前报道的,异步流是自2015年以来一直在努力推进的事。经过多次讨论,最终确定的语法是:

foreach await (string s in asyncStream)

使用下面的方法签名来定义一个异步迭代器

async IAsyncEnumerable<T> MethodName()

与普通的 IEnumberable 方法一样,你可以使用 yield return 来懒式的构建一个对象流。

与Reactive Extensions库里的IObservable相比,这个方案的好处是消费者可以控制流量。这被称为“拉模型”,而IObservable是一种“推模型”,这意味着生产者可以向消费者提供比它所能处理的更高的流量来消耗消费者。

默认接口实现

默认接口实现本质上是一种有限的多重继承形式。 这将允许抽象接口完全定义方法,就像抽象类一样。 然而,抽象接口仍然无法声明构造方法或字段。

注意:你可以使用 ConditionalWeakTable 模拟在接口上的字段。

默认接口实现的主要好处是,你可以向现有的接口添加新的方法而不破坏向后兼容性。 但是这不能保证,因为只有当一个合适的默认方法被设计出来时,它才会起作用。

这是一个非常有争议的功能。 我们不会在这里重复这些讨论,但可以在早期关于默认接口实现的文章中阅读相关总结。

扩展一切

一项对C#的长期抱怨是只可以编写扩展方法,但不能扩展属性。 事实上,在当前模式下都没有办法定义扩展属性或事件。 另外,将扩展方法放在静态类中对许多人来说感觉很奇怪。

在新设计下,有一个新的顶级结构称为“扩展”。 例如,如果要为 Customer 类创建扩展方法和属性,你可以写:

extension CustomerExt extends Customer { //methods and properties go here }

与接口一样,你不能在扩展中定义实例字段,但可以使用ConditionalWeakTable来模拟它们。 你还可以定义静态字段。

除了属性,事件和操作符重载之外,甚至正在考虑允许扩展构造方法。 扩展构造方法在工厂和对象池方案中将非常有趣。

扩展接口

扩展接口,将新接口添加到现有类的能力,也在考虑之中。不过这不会是一个 C# 8 的功能,因为它需要更改底层运行时。

有关C#的未来的更多信息,请查看C#语言设计仓库。

[翻译] C# 8.0 预览的更多相关文章

  1. C# 8.0 预览特性

    初试C# 8.0 Visual Studio 2019的第一个预览版(使用Visual Studio 2019提高每个开发人员的工作效率)和.NET Core 3.0(宣布.NET Core 3预览1 ...

  2. Apache Spark 3.0 预览版正式发布,多项重大功能发布

    2019年11月08日 数砖的 Xingbo Jiang 大佬给社区发了一封邮件,宣布 Apache Spark 3.0 预览版正式发布,这个版本主要是为了对即将发布的 Apache Spark 3. ...

  3. 微软.NET CORE 3.0 预览版 7 发布:大幅减少 SDK 空间大小

    据悉,这个预览版是 .Net Core 3 中重要的版本,可以视为原计划在 7 月发布的 RC 版本 (引自微软 .NET Core 首席 Program Manager Richard 先生原话), ...

  4. Dubbo 3.0 预览版解读,6到飞起~

    , false).start(); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new St ...

  5. 挑战中英实时语音翻译——Skype Translator 中文预览版登陆中国

    Translator 中文预览版登陆中国" title="挑战中英实时语音翻译--Skype Translator 中文预览版登陆中国"> 今天,我们正式宣布在中国 ...

  6. ASP.NET Core 3.0预览版体验

    目前.NET Core 3.0的版本为.NET Core 3.0 Preview 3,对应ASP.NET Core 3.0 Preview 3. ASP.NET Core 3.0 之后将不再支持.NE ...

  7. 安装.NET Core 3.0预览版后VS项目目标框架中不显示的解决方法

    下载了微软在GitHub上的cSharpSamples项目后发现其中一些项目使用框架为.NET Core3.0,就下载了.NET Core3.0,但发现项目依然不可用,编译时提示如下 当前 .net ...

  8. .NET Core 3.0预览版7中的ASP.NET Core和Blazor更新

    .NET Core 3.0 Preview 7现已推出,它包含一系列ASP.NET Core和Blazor的新更新. 以下是此预览中的新功能列表: 最新的Visual Studio预览包括.NET C ...

  9. .NET 5.0预览版6发布:支持Windows ARM64设备

    2020年6月25日,微软dotnet团队在博客宣布了第六个 .NET 5.0 的预览版:https://devblogs.microsoft.com/dotnet/announcing-net-5- ...

随机推荐

  1. Servlet端 接收不到4096,8192长度的JSON参数

    Servlet端的日志显示,客户端传过来的JSON参数是空值. 但是在客户端的日志显示,已将JSON参数传送过去. 经调查发现,加减1位后的JSON参数均可以正常传送. 只有8192,4096长度的J ...

  2. Java探秘之基本数据类型和包装类(int,Integer)(一)

    最近闲来无聊打算做一个博客网,没事记记笔记什么,可是网站不好做,需要点时间,就先写写笔记来练练手. 可是要写什么呢,太难的好像我也写不出来,万一写错了误导别人就不好了. 哈哈,不多说,直奔主题,要是写 ...

  3. windows调试工具列表

    摘自windbg帮助文档(windbg中输入.hh): Debugging Tools for Windows (安装WinDbg后这些工具都会安装在目录C:\Program Files (x86)\ ...

  4. ubuntu(linux)新装系统恢复备份后无法进入系统问题的解决

    1. 引子: 可以跳过直接看3.~5. 我们可能会遇到这样的状况,从ubuntu转到别的系统,兜兜转转又回到了ubuntu. 比如说: Fedora升级后一大堆BUG,与java有关的软件渲染都糟糕的 ...

  5. Django学习(七)---添加新文章页面

    在template中添加add_article.html页面 (form  input)请求方法使用post 这个页面涉及到了两个响应函数 1)显示页面的响应函数  2)表单提交的响应函数 add_a ...

  6. 理解梯度下降法(Gradient Decent)

    1. 什么是梯度下降法?   梯度下降法(Gradient Decent)是一种常用的最优化方法,是求解无约束问题最古老也是最常用的方法之一.也被称之为最速下降法.梯度下降法在机器学习中十分常见,多用 ...

  7. CentOS-7.2添加桌面快捷方式

    一,在桌面新建一个文件 文件名随意,但必须带有.desktop的后缀名. gedit /home/zgw/Desktop/zgw.desktop 二,在文件中写入如下内容 [Desktop Entry ...

  8. A----奇怪的玩意

      题目: 我们的化学生物学家发明了一种新的叫stripies非常神奇的生命.该stripies是透明的无定形变形虫似的生物,生活在果冻状的营养培养基平板菌落.大部分的时间stripies在移动.当他 ...

  9. java多态加深

    当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法. public class Dtai ...

  10. Haproxy的配置

    1,下载Haproxy 下载Haproxy 1.6  2,安装haproxy uname -r cd /usr/local/src/haproxy-1.6.9/ make TARGET=linux31 ...