原文: 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. Debian 8添加kali更新源并安装metasploit

    一.Debian 8添加kali更新源 中科大kali更新源: deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contr ...

  2. Android实现模拟表单上传

    很久以前,写过一篇关于下载的文章:基于HTTP协议的下载功能实现,今天对于Android上的文件上传,也简单的提两笔.在Android上,一般使用Http 模拟表单或者FTP来进行文件上传,使用FTP ...

  3. PHP面向对象 ——多态

    接口 接口(interface)是抽象方法和静态常量定义的集合. 接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量. 接口中没有其它类型的内容 接口的定义 /** * 接口可以认为是特殊的 ...

  4. 用CSS的border画三角形

    用border画三角形,实际上属于一种奇淫巧技. 利用的是border的一个特性:当一个元素的宽高都为0时,给border设置宽度(至少给2个相邻的边框设置宽度),border就会撑开这个元素. 四个 ...

  5. CJOJ 1131 机器分配 / Luogu 2066 机器分配 (动态规划)

    CJOJ 1131 机器分配 / Luogu 2066 机器分配 (动态规划) Description Luogu: 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国 ...

  6. memcache缓存安装配置

    memcache是高性能,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度.目前用memcache解决互联网上的大用户读取是非常流行的一种用法. 下载安装 前提要先安装libev ...

  7. thinkphp分页带数据

    因为用thinkphp做分页时候点击下一页后搜索栏的数据会清空,然后点击下一页后刷新完了就没有内容了,感觉网上查找和我自己研究在不适用ajax做分页的情况下用以下代码就可以实现!!通过把值扔地址栏来进 ...

  8. Unity 工作经历+近期面试经历

    由于团队解散,这最近都在找新工作机会--投简历找工作.已经面试三家了,都没拿到offer,挺失落的.把这种感受记录下来,以作后鉴. 这本质上是一篇面试经历的记录,并不是什么面试攻略,主要是给自己总结的 ...

  9. OPNET中FIN,FOUT以及FRET的作用 分类: opnet 2014-05-12 16:07 144人阅读 评论(0) 收藏

    为了使一个用户定义的函数被执行,该函数必须与一个特殊的堆栈跟踪代码相连.堆栈跟踪技术靠在函数的入口点和出口点插入预处理器宏指令完成(一个函数只有一个入口点,但可以有多个出口点(由C语言的return声 ...

  10. 关于bootstrap的一些想法

    老实说,作为一个前端人员,我不怎么会去用bootstrap,但是我会去看,会去了解. 首先,bootstrap其实是给后台以及前端新人用来快速完成一个页面的简单布局,不是按照设计稿psd格式给定做的那 ...