首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C# 8.0正式发布:Visual Studio 2019支持所有新功能

微软宣布C# 8.0作为 .NET Core 3.0版本的一部分正式可用,该消息同步发布于.NET Conf 2019其开发博客中。新的语言功能包括可为空的引用类型、异步流、默认接口成员及新的代码模式。Visual Studio 2019支持所有的新功能。

可为空引用类型是新版本中最重要的功能之一。它旨在通过使用特定语法规则来防止与空引用异常相关的场景,这个语法规则是:开发人员必须明确表示某个变量是否可以采用null值。在这种情况下,变量声明中的类型名必须附加“?”(类似可为空的值类型):

代码语言:javascript
复制
string? foo;

如果该变量的类型名后面没有附加“?”,那么,它被视为一个不可为空的引用类型。在这种情况下,编译器将强制实行不可为空的规则:该变量必须被初始化为一个非空值,并且该变量永远不能被赋予空值。可以(在大多数情况下不推荐)用变量名后面附加空宽容操作符“!”来覆盖这个行为:

代码语言:javascript
复制
foo!.Length;

还可以使用可为空上下文来控制是否给出可空警告,或者可为空的注解是否有影响。可以在项目级别或在带有#nullable和 #pragmawarning 预处理指令的源代码文件中指定可为空上下文。另外,一个类型可以具备的可为空行为是如下四种之一:无视(Oblivious),不可为空(nonnullable),可为空(nullable),未知(unknown)。不同的可为空类型会触发不同的编译行为。可为空引用类型的完整规范在这里

另一个重要功能是引入了异步流。该新功能的目的是引入对迭代器和异步方法的支持。此类方法可以用于需要消费或产生持续结果流(即来自物联网设备或云服务)的场景中。

异步流通过IAsyncEnumerable  和 IAsyncEnumerator 接口实现,这些接口可以与async/await功能(最初在C# 5.0中引进)结合使用。返回异步流的方法必须用async 修饰符声明,还必须使用某个新接口作为其返回类型。它还必须包含 yield return 语句来返回异步流中的后续元素。

下面的例子来自微软的官方文档。它实现了一个生成从0到19的序列的方法,生成每个数字之间的等待时间为100毫秒:

代码语言:javascript
复制
public static async System.Collections.Generic.IAsyncEnumerable<int> GenerateSequence()
{
    for (int i = 0; i < 20; i++)
    {
        await Task.Delay(100);
        yield return i;
    }
}

更多关于异步流的细节请参阅官方语言规范

默认接口成员功能允许开发人员给接口添加成员,并提供这些成员的实现(从而允许接口中的方法有具体实现)。目的是为API作者提供更多的灵活性,从而可以给现有接口添加方法而不会破坏与以前版本的兼容性。这个功能类似于Java的Default Methods

C# 8.0还添加了两个新的代码模式:递归模式匹配和与using 语句相关的模式。简而言之,递归模式允许模式包含其他模式,如下例所示(也来自于微软的官方文档):

代码语言:javascript
复制
IEnumerable<string> GetEnrollees()
{
    foreach (var p in People)
    {
        if (p is Student { Graduated: false, Name: string name }) yield return name;
    }
}

模式Student { Graduated: false, Name: string name }会检查Person是否是Student,然后将常量模式false应用于其Graduated属性来看看其是否仍然已注册,并将模式string name应用于其Name属性来获得其名字(如果为非空)。因此,如果p是Student,还没有毕业并拥有一个非空名字,那么,我们返回该名字。

using语句相关的新模式允许它被添加到局部变量声明中。在这种情况下,局部变量using的寿命将延长到声明它的范围的末尾。如果有多个using局部变量,那么将按照声明它们的相反顺序进行处理:

代码语言:javascript
复制
{
    using var foo1 = new FileStream("...");
    using var foo2 = new FileStream("...");
    ...    
    // Dispose foo2
    // Dispose foo1
}

using 语句添加的另一个功能是disposable模式的概念,即可访问Dispose实例方法的类型。遵循这个模式的类型可以参与using语句,而无需实现IDisposable:

代码语言:javascript
复制
class Bar
{
    public void Dispose() { ... }
}
using (var foo = new Bar())
{
    // statements
}

C# 8.0中添加的其他功能包括switch语句语法的更改和目标类型的新表达式的添加,这允许在已经给定类型的上下文中创建新对象时,省略类型声明:

代码语言:javascript
复制
Vector2[] vectors = { new (1, 1), new (2, -1) };

所有新功能的摘要都在这里,C#8.0的完整规范建议在这里。另外,YouTube上(这里这里)有 .NET Conf 2019上展示新特性的技术演讲,该演讲强调了新的语言功能。所有Visual Studio 2019 版本中都支持C# 8.0。

原文链接:

Microsoft Releases C# 8.0

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/8NIwuSl4HlhiWJGByF03
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券